Frage zu float und double - Genauigkeit - Addition/Multiplikation

Ist bei Gleitkommazahl en die Addition oder die Multiplikation genauer?

Konkret geht es um:

a / 100.0 + 1.0
und
(a + 100.0) / 100.0

was ist genauer (a==int)?

Moin,

was genau meinst Du ?
Und was meinst Du bitte mit (a==int) ??

gruß
Klaus

Die Zahlen werden bei allen Operationen mit der gleichen Genauigkeit verwaltet.

[quote=Unregistriert;71805]Konkret geht es um:

a / 100.0 + 1.0
und
(a + 100.0) / 100.0[/quote]
Hier geht es wohl um die Genauigkeit des Ergebnisses, nicht um die der (singulären) Operation.
Für den konkreten Fall liese sich, dass recht einfach überprüfen.
Die zweite Variante wird u.U. genauere Werte liefern, da durch die vorhergehende Erhöhung um 100 bei der Division weniger Nachkommastellen „wegfallen“, als wenn man zuerst die Division durchführt.

und was ist wenn a==0 ist? (0+100.0)/100.0 ist nicht unbedingt 1.0 , 0/100.0+1.0 hingegen schon. Joa, es geht um die genauigkeit des sämtlichen Ergebnis.

Unter welchen Bedingungen liefert (0+100.0)/100.0 nicht 1.0?

Ich denke dem Threadersteller geht es um die allgemeine Ungenauigkeit bei Gleitkommazahlen… keine mathematische Operation ist genau und führt zu Fehlern, da ist Addition nicht besser als Multiplikation, oder andersrum, oder sonstige Kombination. Multiplikation/Division mit Zehnerpotenzen mit Beginn 10^0 (1) sind aber “sicher”, sprich führen allgemein nicht zu Fehlern. Wenn mit Zahlen mit Nachkommastellen arbeiten willst, solltest evtl BigDecimal nehmen.

Wenn man es SO genau wissen will oder muss, ist http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html ein guter Einstiegspunkt. Die Frage, wie genau welches Ergebnis bei welcher Zahlenrepräsentation und welchen Operatoren in welcher Reihenfolge denn letztendlich ist, ist ein Forschungsthema, und das auf irgendeine Aussage wie “Addition ist genauer als Multiplikation” einzudampfen wäre unangebracht. Ich meine mich dunkel-halbwissend zu erinnern, dass z.B. bei Subtraktionen “relativ” große Fehler auftreten, Stichworte wären die im verlinkten Artikel ausführlich besprochene “Cancellation” bzw. gleich http://en.wikipedia.org/wiki/Loss_of_significance

öh - nein

die Zahl wird entsprechend den Vorschriften in ihre Binärdarstellung gewandelt. D.h. vor dem Komma entsprechend mit 2[SUP]n[/SUP], nach dem Komma 1 / 2[SUP]n[/SUP]. Anschließend wird das Komma hinter die erste auftretende 1 geschoben (damit die wegfallen kann → spart Speicherplatz und erhöht die Genauigkeit). Um das wieder ins Dezimale zu konvertieren: aus 100.0f wird 1.0f10[SUP]2[/SUP]. Es ist also egal ob ich irgend was mit 100.0f multipliziere oder 0.001f. Daraus wird dann 1.0f10[SUP]2[/SUP] bzw. 1.0f*10[SUP]-3[/SUP]

*** Edit ***


float a = 0.2f;
float b = 0.6f;

b -= a;
a += a;

if (a == b) {
    syso("super");
} else {
    syso("fail"); // wird ausgegeben
}

in solchem Beispiel - ich habe meinen Beitrag jetzt im alten Forum nicht gefunden - ich will da auch nicht weiter suchen.