Mit Python 2.7.10 habe ich durch Zufall herausgefunden, dass 5 * math.sqrt (3) und math.sqrt (5 ** 2 * 3) nicht die sind gleiche float:Python: seltsames Rundungsverhalten von math.sqrt()
import math
import decimal
print decimal.Decimal(5*math.sqrt(3))
print decimal.Decimal(math.sqrt(5**2*3))
print 5*math.sqrt(3) == math.sqrt(5**2*3)
kehrt
8.660254037844385521793810767121613025665283203125
8.6602540378443872981506501673720777034759521484375
False
, die zeigt, dass sie am 15. Dezimalstelle abweichen. Faszinierend, diese Zahlen nicht geschieht für benachbarte 5 und 3. Mit dem folgenden Code ein paar Paare von Zahlen zeigen, für welche die Gleichheit nicht:
for j in range(1,10+1):
for i in range(1,10+1):
a = i*math.sqrt(j)
b = math.sqrt(i**2*j)
if not(a == b):
print [i,j],
Die Liste der problematischen [i, j] Paare umfassen: [3, 2], [6, 2], [9, 2], [5, 3], [9, 3], [10, 3], [3, 6], [6, 6], [7, 6] , [3, 8], [6, 8], [9, 8], [5, 10], [7, 10], [10, 10] ... Irgendwelche Ideen, warum die Rundung bricht und warum gerade für diese Paare, und nicht andere?
Was erwarten Sie von Decimal? –
Während ein interessanter Fund, nur weil [Fließkomma-Mathematik ist gebrochen] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken). Keiner dieser Werte ist "korrekt" - der Unterschied kann in der Zwischenrundung liegen. – usr2564301
math ist bekannt, dass genaue Ergebnisse mit langen Dezimalzahlen nicht zurückgegeben werden. Ich bezweifle, dass die Liste der "problematischen Paare" ist genau, eher kontextbezogene –