Estoy tratando de entender qué es la máquina épsilon. Según Wikipedia, se puede calcular de la siguiente manera:
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
Sin embargo, solo es adecuado para números de doble precisión. Estoy interesado en modificarlo para admitir también números de precisión simple. Leí que se puede usar numpy, particularmente numpy.float32
class. ¿Alguien puede ayudar a modificar la función?
numpy.float32
como argumento a la función!Respuestas:
Una forma más fácil de obtener el épsilon de la máquina para un tipo de flotante dado es usar
np.finfo()
:fuente
>>> print(np.finfo(np.float).eps) = 2.22044604925e-16
y>>> print(np.finfo(np.float64).eps) = 2.22044604925e-16
np.float
lugar, ya que es solo un alias del incorporado de Pythonfloat
. Los flotadores de Python son de 64 bits (Cdouble
) en casi todas las plataformas.float
y,np.float64
por lo tanto, suelen tener una precisión equivalente, y para la mayoría de los propósitos puede usarlos indistintamente. Sin embargo, no son idénticos:np.float64
es un tipo específico de muchos, y unnp.float64
escalar tiene métodos diferentes a unfloat
escalar nativo . Como era de esperar,np.float32
es un flotante de 32 bits.Otra forma fácil de obtener épsilon es:
fuente
8./3 - 5./3 - 1
rinde-eps
y4./3 - 1./3 - 1
rinde cero y10./3 - 7./3 - 1
rinde cero?numpy
internos cuando hay unanumpy
función existente para encontrar el épsilon.¡Ya funcionará, como señaló David!
fuente
NameError
si la condiciónwhile
se cumple en la primera verificación, por lo que probablemente tenga sentido hacerlomachine_epsilon = machine_epsilon_last = func(1)
en la primera declaración