Wie berechne ich den kleinsten Wert, welcher beim Vergleich zweier floats als Unterschied erkannt wird?
Verfasst: Sonntag 28. Oktober 2018, 19:10
Hallo,
ich hatte festgestellt, dass der Vergleich von großen float-Werten, deren Differenz gering ist, nicht wie erwartet abläuft. (Siehe hier meine Frage auf stackoverflow.)
Ein Unterschied wird offenbar erst dann bemerkt, wenn er genügend groß ist.
Wenn ich die Antwort richtig verstanden habe, beschränkt sich dies nicht nur auf sehr große floats, sondern floats im Allgemeinen:
Wenn m*eps den Mindestwert darstellt, so sollte jeder Wert der kleiner ist eigentlich dazu führen, dass zwei floats als gleich gelten.
Eben das ist aber nicht der Fall!
Was mache ich falsch?
Obiger Code wurde mit Python 3.5.2 auf einem 64-Bit System ausgeführt.
Mit freundlichen Grüßen
AFoeee
ich hatte festgestellt, dass der Vergleich von großen float-Werten, deren Differenz gering ist, nicht wie erwartet abläuft. (Siehe hier meine Frage auf stackoverflow.)
Ein Unterschied wird offenbar erst dann bemerkt, wenn er genügend groß ist.
Code: Alles auswählen
import sys
m = sys.float_info.max # type 'float'
m == m # True
m < m # False
m > m # False
m == m-1.0 # True
m < m-1.0 # False
m > m-1.0 # False
m == m-1e100 # True
m < m-1e100 # False
m > m-1e100 # False
m == m-1e300 # False
m > m-1e300 # True
m < m-1e300 # False
- Erst wenn die Differenz zweier Werte größer als ein Mindestwert ist, wird ein Unterschied bemerkt.
- Dieser Mindestwert hängt von den zu vergleichenden Werten ab.
Code: Alles auswählen
import sys
m = sys.float_info.max # type 'float'
eps = sys.float_info.epsilon
# Mindestwert ist 'm*eps'
m == m-(m*(eps/10)) # True
m == m-(m*eps) # False
Eben das ist aber nicht der Fall!
Code: Alles auswählen
import sys
m = 1000000.0
eps = sys.float_info.epsilon
min_dif = m * eps # 0.000000000222044.....
m == m - min_dif # False
m == m - (min_dif/2) # False
m == m - (min_dif/10) # True
m == m - 0.00000000021 # False
Obiger Code wurde mit Python 3.5.2 auf einem 64-Bit System ausgeführt.
Mit freundlichen Grüßen
AFoeee