Fließkommafehler ärgert mich



  • Ich habe ein Programm aufgestellt und nun muss
    ich fest stellen, dass alle Rechnungen durch die
    Fließkommafehler in einem solchen Grad verfälscht wurden,
    dass die Ergebnisse nicht mehr zumutbar sind.

    Ich habe schon von GMP gehört, aber das zu compilieren
    geht mit meinem Compiler (VC2005) leider nicht, ist
    auch nicht in der Doku erwähnt wie man das macht.

    Gibt es noch eine andere, leichter zu integrierende
    Lib, die man in 20 Minuten am Laufen hat?

    mfG
    Listing



  • Um wie viele Nachkommastellen handelt es sich denn?



  • 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 wie

    GMP 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/


Anmelden zum Antworten