Ich versuche die Gleitkommaarithmetik hinter diesem einfachen Beispiel zu verstehen. Beide Codes sind in der Theorie arithmetisch äquivalent, aber offensichtlich fügt eine Reihe von Additionen mehr Fehler hinzu als eine einfache Multiplikation.Gleitkommaarithmetik: Summierung versus Multiplikation des Fehlers
s=0.0
for i in range(10):
s += 0.1
print(s)
print('%.30f' % s)
0.9999999999999999
0.999999999999999888977697537484
aber:
s=0.1
s *= 10
print(s)
print('%.30f' % s)
1.0
1.000000000000000000000000000000
Ich möchte verstehen, was hinter den Kulissen vor sich geht.
Ich verstehe, dass die binäre Darstellung der Dezimalzahl 0,1 nie genau ist, und das kann durch überprüft werden:
print(0.1)
print('%.30f' % 0.1)
0.1
0.100000000000000005551115123126
So in einer Folge von Additionen, dass Rest hält 5.55e-18
Hinzufügen von bis zu den variablen und sehr schnell wächst es.
Allerdings würde ich bei der Multiplikation erwarten, dass der gleiche Rest auch multipliziert wird und es würde wachsen, aber das passiert nicht. Warum das? Jede Art von Optimierung vor der Konvertierung in Binärdateien?
Danke für die gründliche Erklärung. Es macht jetzt Sinn. – Raf
Es lohnt sich, hinzuzufügen, dass das Runden auf 53 Bits mit IEEE-754 Fließkommaarithmetik zu tun hat. [https://docs.python.org/3/tutorial/floatingpoint.html#representation-error] – Raf