Подтвердить что ты не робот

Машина python numpy epsilon

Я пытаюсь понять, что такое машинный эпсилон. Согласно Википедии, ее можно рассчитать следующим образом:

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

Однако он подходит только для чисел с двойной точностью. Я заинтересован в его модификации для поддержки чисел с одной точностью. Я читал, что можно использовать numpy, особенно класс numpy.float32. Может ли кто-нибудь помочь с изменением функции?

4b9b3361

Ответ 1

Более простой способ получить epsilon машины для данного типа float - использовать np.finfo():

print(np.finfo(float).eps)
# 2.22044604925e-16

print(np.finfo(np.float32).eps)
# 1.19209e-07

Ответ 2

Еще один простой способ получить epsilon:

In [1]: 7./3 - 4./3 -1
Out[1]: 2.220446049250313e-16

Ответ 3

Он будет работать, как указал Давид!

>>> 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
... 
>>> machineEpsilon(float)
2.220446049250313e-16
>>> import numpy
>>> machineEpsilon(numpy.float64)
2.2204460492503131e-16
>>> machineEpsilon(numpy.float32)
1.1920929e-07