Próbuję zrozumieć, czym jest epsilon maszyny. Według Wikipedii można to obliczyć w następujący sposób:
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
Jednak nadaje się tylko do liczb o podwójnej precyzji. Jestem zainteresowany modyfikacją go, aby obsługiwał również liczby o pojedynczej precyzji. Czytałem, że można użyć numpy, szczególnie numpy.float32
class. Czy ktoś może pomóc w modyfikacji funkcji?
numpy.float32
jako argument do funkcji!Odpowiedzi:
Łatwiejszym sposobem uzyskania epsilon maszyny dla danego typu pływaka jest użycie
np.finfo()
:źródło
>>> print(np.finfo(np.float).eps) = 2.22044604925e-16
i>>> print(np.finfo(np.float64).eps) = 2.22044604925e-16
np.float
zamiast tego użyć , ponieważ jest to tylko alias wbudowanego języka Pythonfloat
. Python float są 64-bitowe (Cdouble
) na prawie wszystkich platformach.float
inp.float64
dlatego zwykle mają równoważną precyzję i do większości celów można ich używać zamiennie. Jednak nie są identyczne -np.float64
jest typem specyficznym dla numpy, anp.float64
skalar ma inne metody niż natywnyfloat
skalar. Jak można się spodziewać,np.float32
jest to 32-bitowa liczba zmiennoprzecinkowa.Innym łatwym sposobem na zdobycie epsilon jest:
źródło
8./3 - 5./3 - 1
wydajności-eps
i4./3 - 1./3 - 1
rentowności zera, a10./3 - 7./3 - 1
plony zero?numpy
wewnętrznych elementów, gdy istniejenumpy
funkcja, aby znaleźć epsilon.To już zadziała, jak zauważył David!
źródło
NameError
jeśli warunek wwhile
zostanie spełniony przy pierwszym sprawdzeniu, więc prawdopodobnie ma sens to zrobićmachine_epsilon = machine_epsilon_last = func(1)
w pierwszym oświadczeniu