Fließkommafehler ärgert mich
-
temporärer-gast schrieb:
Um wie viele Nachkommastellen handelt es sich denn?
Es geht darum, dass er eine Zahl fälschlich als eine ganze Zahl erkennt die keine ist. Denn 4.000005 ist ja nicht 4

-
Vielleicht werden in deinem Programm inplizierte Typprüfungen durchgeführt, also z.b. flot -> int.
Gcc gibt mit entsprechen Flags dabei jedoch eine Warnmeldung aus.
-
long double a = 4.000005L;
Das geht nicht? Bist du dir da sicher?
-
The-Kenny schrieb:
Vielleicht werden in deinem Programm inplizierte Typprüfungen durchgeführt, also z.b. flot -> int.
Gcc gibt mit entsprechen Flags dabei jedoch eine Warnmeldung aus.
Ja, ich will die Floatzahl runden um zu gucken ob sie eine ganze Zahl ist
Pseudo-Code:
if(floatNormal == floatGerunded)
break;Um zu runden convertiere ich in integer und wieder zurück zu float
-
ja, ist doch klar
Beispiel:
float 1,5 wird in int konvertiert, dann ist das wohl 1, dann konvertierst du 1 warscheinlich wieder zurück also 1.0!
-
temporärer-gast schrieb:
ja, ist doch klar
Beispiel:
float 1,5 wird in int konvertiert, dann ist das wohl 1, dann konvertierst du 1 warscheinlich wieder zurück also 1.0!du verstehst was falsch,
ich will wissen ob die Zahl nachkommastellen hat oder nicht...comf = myfloat; rounded = (int)comf; secf = rounded; if(secf == comf) break;
-
Merke, C-Style-Casts sind nicht so praktisch wie C++-Casts

Und schreib bitte mal, welche Typen die Variablen haben, und wenn möglich, auch die Stelle an der deiner Meinung nach der Fehler auftritt.
Auch kann es helfen, das Programm mal mit einem Debugger durchzugehen.
-
// IntegerHochrechner.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include <windows.h> #include <iostream> using namespace std; void main() { //Declarations float f; int rounded; float comf; float secf; __int64 i = 0; __int64 trylimit; cout << "IntegerHochrechner v1.0 loaded!" << endl << "Please enter a float digit: "; cin >> f; cout << "How many tries do you want to do?" << endl << "Tries: "; cin >> trylimit; cout << "Working..." << endl; while (i < trylimit) { ++i; comf = (f * i); rounded = comf; secf = rounded; if(secf == comf) break; } cout << "Calculation done!" << endl; cout << "Multiplier was identified as: " << i << "." << endl; cout << "Proof: " << f << " * " << i << " = " << comf << endl; system("pause"); }IntegerHochrechner v1.0 loaded!
Please enter a float digit: 1.22133
How many tries do you want to do?
Tries: 10000000
Working...
Calculation done!
Multiplier was identified as: 3985.
Proof: 1.22133 * 3985 = 4867
Drücken Sie eine beliebige Taste . . .Dabei gilt
1.22133 * 3985 = 4867,00005

PS: Jaaaa, ich weiß dass die floatzahl überlaufen kann
-
wie wärs wenn du anstatt float mal ein long double versuchst?
double kann schon wirklich eine ganze menge fassen. Aber genau wirst du es nie erreichen, irgendwann ist schluss. Ich kann mir aber auch kaum vorstellen, dass GMP nicht mit MSVC05 läuft. was ist denn das problem?
-
Vielen Dank jetzt ist es etwas genauer, bei großen Zahlen aber immernoch Fehlerbehaftet
IntegerHochrechner v1.0 loaded! Please enter a float digit: 1.22133 How many tries do you want to do? Tries: 100000000 Working... Calculation done! Multiplier was identified as: 100000. Proof: 1.22133 * 100000 = 122133 Drücken Sie eine beliebige Taste . . .Mit GMP sollte es komplett ohne Fehler gehen, deshalb bin ich da scharf drauf

Aber in der Manual (http://gmplib.org/gmp-man-4.2.1.pdf)
steht etwas wieGMP has an autoconf/automake/libtool based configuration system. On a Unix-like system a basic build can be done with ./configure make Some self-tests can be run with make check And you can install (under ‘/usr/local’ by default) with make install If you experience problems, please report them to gmp-bugs@swox.com. See Chapter 4 [Reporting Bugs], page 28, for information on what to include in useful bug reports.Sowas kann man nicht mit vc2005 compilieren, jedenfalls wird nicht erklärt wie
-
Hallo,
Wenn du unbedingt GMP willst, hilft dir vielleicht das hier
http://www.cs.nyu.edu/exact/core/gmp/