Ich versuche zu verstehen, was Maschinen-Epsilon ist. Laut Wikipedia kann es wie folgt berechnet werden:
def machineEpsilon(func=float):
machine_epsilon = func(1)
while func(1)+func(machine_epsilon) != func(1):
machine_epsilon_last = machine_epsilon
machine_epsilon = func(machine_epsilon) / func(2)
return machine_epsilon_last
Es ist jedoch nur für Zahlen mit doppelter Genauigkeit geeignet. Ich bin daran interessiert, es so zu ändern, dass es auch Zahlen mit einfacher Genauigkeit unterstützt. Ich habe gelesen, dass Numpy verwendet werden kann, insbesondere numpy.float32
Klasse. Kann jemand bei der Änderung der Funktion helfen?
numpy.float32
als Argument an die Funktion!Antworten:
Eine einfachere Möglichkeit, das Maschinen-Epsilon für einen bestimmten Schwimmertyp zu erhalten, ist die Verwendung von
np.finfo()
:quelle
>>> print(np.finfo(np.float).eps) = 2.22044604925e-16
und>>> print(np.finfo(np.float64).eps) = 2.22044604925e-16
np.float
stattdessen verwenden können, da es nur ein Alias von Pythons eingebautem istfloat
. Python-Floats sinddouble
auf fast allen Plattformen 64-Bit (C ).float
und habennp.float64
daher normalerweise die gleiche Präzision, und für die meisten Zwecke können Sie sie austauschbar verwenden. Sie sind jedoch nicht identisch - esnp.float64
handelt sich um einen numpy-spezifischen Typ, und einnp.float64
Skalar hat andere Methoden als ein nativerfloat
Skalar. Wie zu erwartennp.float32
ist ein 32-Bit-Float.Ein weiterer einfacher Weg, um Epsilon zu bekommen, ist:
quelle
8./3 - 5./3 - 1
Ausbeute-eps
und4./3 - 1./3 - 1
Ausbeuten Null, und die10./3 - 7./3 - 1
Renditen Null?numpy
Interna erfordert, wenn einenumpy
Funktion zum Auffinden des Epsilons vorhanden ist.Es wird schon funktionieren, wie David betonte!
quelle
NameError
wenn die Bedingung beiwhile
der ersten Überprüfung erfüllt ist, so dass es wahrscheinlich sinnvoll ist, diesmachine_epsilon = machine_epsilon_last = func(1)
in der ersten Anweisung zu tun