Я пытаюсь понять, что такое машинный эпсилон. Согласно Википедии, его можно рассчитать следующим образом:
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
class. Кто-нибудь может помочь с изменением функции?
numpy.float32
функции в качестве аргумента!Ответы:
Более простой способ получить машинный эпсилон для данного типа с плавающей запятой - использовать
np.finfo()
:источник
>>> print(np.finfo(np.float).eps) = 2.22044604925e-16
и>>> print(np.finfo(np.float64).eps) = 2.22044604925e-16
np.float
вместо этого, поскольку это просто псевдоним встроенного Pythonfloat
. Поплавки Python 64-битные (Cdouble
) почти на всех платформах.float
иnp.float64
поэтому обычно имеют эквивалентную точность, и для большинства целей вы можете использовать их как взаимозаменяемые. Однако они не идентичны -np.float64
это тип, специфичный для numpy, и уnp.float64
скаляра есть методы, отличные от собственногоfloat
скаляра. Как и следовало ожидать,np.float32
это 32-битное число с плавающей запятой.Еще один простой способ получить эпсилон:
источник
8./3 - 5./3 - 1
дает-eps
, и4./3 - 1./3 - 1
дает ноль, и10./3 - 7./3 - 1
дает ноль?numpy
внутреннем устройстве, когда существуетnumpy
функция для поиска эпсилона.Как сказал Дэвид, это уже будет работать!
источник
NameError
если условиеwhile
будет выполнено при первой проверке, поэтому, вероятно, имеет смысл сделать этоmachine_epsilon = machine_epsilon_last = func(1)
в первом операторе