Runden mal wieder und zwar die Zahl 824.77



  • Hallo.
    Ich habe ein kleines Double Rundungsproblem.

    Diese Zahl lässt sich nicht vernünftig runden.
    Wenn man eine Dezimalverschiebung macht wie bei fast allen Rundungsansätzen, bekommt man 82477 als Int Wert und dividiert diesen später um 100.

    double a = 82477;
    double b = a / 100; // b = 824.76999999999998

    alleine die Zuweisung geht nicht
    double ttt2 = 824.77; // im debugger = 824.76999999999998

    Wie kann ich dieses richtig runden. Gibts da überhaupt eine Mathematische Möglichkeit in c/c++. Im Notfällen auch in .net. Runden über Strings geht auch nicht, da diese Zahl alleine ja schon falsch angezeigt wird.
    Mal ganz kurz und dirty und nicht vollständig von 5 aufwerts.

    double runden(double Zahl, int Stellen)
    {
    	// so wie aus dem FAQ runden
    	double v[] = { 1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8 };  // mgl. verlängern
    	double ergebniss = floor(Zahl * v[Stellen] + 0.5) / v[Stellen]; 
    
    	const int max_stellen = 256;
    	char zahl[max_stellen];
    	char zahl2[max_stellen];
    	sprintf(zahl,"%f",ergebniss);
    	int trenner_stelle = -1;
    	for(int i = 0; i <max_stellen;i++)
    	{
    		if(trenner_stelle >=0)
    		{
    			trenner_stelle ++;
    		}
    		if(zahl[i] == '.')
    		{
    			trenner_stelle = 0;
    		}
    		if(trenner_stelle == Stellen)
    		{
    			if(i + 1 < max_stellen)
    			{
    				char z = zahl[i+1];
    				if(z == '0' || z == '1' || z == '2' || z == '3' ||  z == '4' )
    				{
    					zahl2[i] = zahl[i];
    				}
    				else
    				{
    					zahl2[i] = zahl[i];
    				}
    			}
    			zahl2[i + 1 ] = '\0';
    			break;
    		}
    		else
    		{
    			zahl2[i] = zahl[i];
    		}	
    	}
    
    return atof(zahl2);
    

    Rückgabe passt 824.77. Aber übergabe an einem Double geht nicht.

    Danke vorweg.



  • Nicht alle Kommazahlen lassen sich nicht genau speichern. Der Computer speichert die beste Annäherung. Wie das genau funktioniert wird im IEEE 754 Floating Point Standard definiert.

    Edit: Falsche Nummer im Standard korrigiert.



  • 314159265358979 schrieb:

    Nicht alle Kommazahlen lassen sich nicht genau speichern.

    Ich kaufe noch ein "nicht".



  • ups 😃



  • 314159265358979 schrieb:

    ... wird im IEEE 759 Floating Point Standard definiert.

    Du meinst bestimmt IEEE 754.



  • Tachyon schrieb:

    314159265358979 schrieb:

    ... wird im IEEE 759 Floating Point Standard definiert.

    Du meinst bestimmt IEEE 754.

    Zeitgleich (editiert) 😃



  • Mit Basistypen geht das nicht, aber mit Basistypen dürfte das auch in den wenigsten anderen Sprachen gehen - die benutzen alle den selben Standard.

    Es gibt allerdings Bibliotheken, die diese Funktionalität auf andere Weise bereitstellen; ich denke da etwa an libmpfr.



  • Entschuldigung, da habe ich gerade falsch geschaltet; 1/100 ist natürlich auch mit längerer Präzision nicht genau darstellbar. Vielleicht kommt man mit den mpq-Funktionen bzw. -Klassen aus GMP weiter; die können das zumindest intern genau darstellen.



  • Wieso haben immer wieder Leute mit floating-point Probleme? Interne Darstellung und Berechnungen sind innerhalb der vom Datentyp float, double, long double vorgegenen Grenzen (min, max) sehr präzise. Viele denken seit der Grundschule im Dezimalsystem, das für die Computerei unbrauchbar bzw. nicht effizient ist. Für den Menschen sind Binärzahlen schwer zu lesen, für ein Computersystem aber nicht! Sollen die Entwickler von Prozessoren was anderes machen? 😕 Wird doch nur teurer und langsamer! 🕶



  • berniebutt schrieb:

    Wieso haben immer wieder Leute mit floating-point Probleme? Interne Darstellung und Berechnungen sind innerhalb der vom Datentyp float, double, long double vorgegenen Grenzen (min, max) sehr präzise. Viele denken seit der Grundschule im Dezimalsystem, das für die Computerei unbrauchbar bzw. nicht effizient ist. Für den Menschen sind Binärzahlen schwer zu lesen, für ein Computersystem aber nicht! Sollen die Entwickler von Prozessoren was anderes machen? 😕 Wird doch nur teurer und langsamer! 🕶

    Wir sollten einfach anfangen Binär zu Rechnen und in ASCII zu denken.



  • berniebutt schrieb:

    Wieso haben immer wieder Leute mit floating-point Probleme?

    aus den von dir genannten Punkten folgt, dass die meisten Computer für menschen nicht gut nachvollziehbar rechnen. Aber mal ne andere Sache: hast du jemals etwas sinnvolles zu einem Thema beigetragen?


Anmelden zum Antworten