в Python и NumPy машина Эпсилон
Я пытаюсь понять, что такое машинное Эпсилон. Согласно Википедии, он может быть рассчитан следующим образом:
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
класса. Кто-нибудь может помочь с изменением функции?
3 ответа:
более простой способ получить машину epsilon для данного типа поплавка-использовать
np.finfo()
:print(np.finfo(float).eps) # 2.22044604925e-16 print(np.finfo(np.float32).eps) # 1.19209e-07
Он уже будет работать, как отметил Дэвид!
>>> 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