python numpy máquina epsilon


Estoy tratando de entender lo que es la máquina epsilon. Según la 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 soportar también números de precisión única. He leído que numpy puede ser usado, particularmente la clase numpy.float32. ¿Alguien puede ayudar con la modificación de la función?

Author: Bob, 2013-10-02

3 answers

Una forma más fácil de obtener el epsilon de la máquina para un tipo de flotador dado es usar np.finfo():

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

print(np.finfo(np.float32).eps)
# 1.19209e-07
 121
Author: ali_m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-07 15:59:42

Otra forma fácil de obtener epsilon es:

In [1]: 7./3 - 4./3 -1
Out[1]: 2.220446049250313e-16
 66
Author: Ullen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-06 17:08:01

¡Ya funcionará, como David señaló!

>>> 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
 13
Author: Claudiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-02 16:12:20