bessere Präzision durch Multiplikation oder durch Division?



  • Hey zusammen,

    die Frage steht im Titel;

    Sollte ich z.B. eher
    '10.743927549285 * 0.5'
    oder
    '10.743927549285 / 2.0' rechnen?
    Was ist genauer (mit gcc/g++)?

    Würde mich mal interessieren...

    Viele Grüße,

    informat



  • * 0.5 könnte schneller sein. An der Genauigkeit sollte sich nicht viel ändern, zumal auf die letzten paar Stellen von Fließkommazahlen eh kein Verlass ist (auch wenns bei double lange dauert, bis das erreicht ist, siehe epsilon)



  • Bei Dezimalstellen wird binär gerundet. Also am besten so:

    '10.743927549285 * (1 / 2)'
    


  • Divis0r schrieb:

    Bei Dezimalstellen wird binär gerundet. Also am besten so:

    '10.743927549285 * (1 / 2)'
    

    Ganz falsch. *0.5 oder /2.0 ist ok und angeraten.



  • volkard schrieb:

    Divis0r schrieb:

    Bei Dezimalstellen wird binär gerundet. Also am besten so:

    '10.743927549285 * (1 / 2)'
    

    Ganz falsch.

    also x * (1/2) ist schon genauer, da kommt immer genau 0 raus. 😃



  • informat085 schrieb:

    die Frage steht im Titel;

    Sollte ich z.B. eher
    '10.743927549285 * 0.5'
    oder
    '10.743927549285 / 2.0' rechnen?

    Was ist genauer (mit gcc/g++)?

    Ich würde 0.5 schreiben. Multiplizieren ist meist schneller als Dividieren bei floating point.

    Der GCC ist aber bekannt dafür, dass er konstante Ausdrücke a la (3.14159265/27.0*sin(0.2)) schon zur Compile-Zeit mit Hilfe einer "multiple precision library" ausrechnet. Das Ergebnis kann also genauer sein als das, was Du zur Laufzeit berechnen kannst.

    Was die Genauigkeit zwischen *0.5 und /2.0 angeht, macht das keinen Unterschied. Üblich ist die Speicherung von Fließkommazahlen der Form

    Vorzeichen * Mantisse * Basis^Exponent
    

    wobei Basis meistens 2 ist und Mantisse durch üblicherweise 23-52 Bits kodiert wird. Von Überläufen des Exponenten mal abgesehen, ist die Multiplikation mit Potenzen der Basis genauso wie die Division durch Potenzen der Basis verlustfrei -- weil ja nur Exponent, welches eine Ganzhahl ist, erhöht oder erniedrigt wird.

    Gruß,
    SP



  • Vielen Dank für die Anworten! 🙂


Anmelden zum Antworten