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.float32class. ¿Alguien puede ayudar a modificar la función?

numpy.float32como 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-16y>>> print(np.finfo(np.float64).eps) = 2.22044604925e-16np.floatlugar, ya que es solo un alias del incorporado de Pythonfloat. Los flotadores de Python son de 64 bits (Cdouble) en casi todas las plataformas.floaty,np.float64por 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.float64es un tipo específico de muchos, y unnp.float64escalar tiene métodos diferentes a unfloatescalar nativo . Como era de esperar,np.float32es un flotante de 32 bits.Otra forma fácil de obtener épsilon es:
fuente
8./3 - 5./3 - 1rinde-epsy4./3 - 1./3 - 1rinde cero y10./3 - 7./3 - 1rinde cero?numpyinternos cuando hay unanumpyfunción existente para encontrar el épsilon.¡Ya funcionará, como señaló David!
fuente
NameErrorsi la condiciónwhilese cumple en la primera verificación, por lo que probablemente tenga sentido hacerlomachine_epsilon = machine_epsilon_last = func(1)en la primera declaración