151 votes

Python numpy machine epsilon

Je cherche à comprendre ce qu'est l'epsilon machine. Selon Wikipédia, cela peut être calculé comme suit :

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

Cependant, cela convient uniquement aux nombres en double précision. Je suis intéressé à le modifier pour supporter également les nombres en simple précision. J'ai lu que numpy peut être utilisé, en particulier la classe numpy.float32. Est-ce que quelqu'un peut m'aider à modifier la fonction?

272voto

ali_m Points 7185

Une façon plus facile d'obtenir l'epsilon de la machine pour un type de flottant donné est d'utiliser np.finfo():

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

print(np.finfo(np.float32).eps)
# 1.19209e-07

119voto

Ullen Points 1247

Un autre moyen facile d'obtenir epsilon est :

In [1]: 7./3 - 4./3 -1
Out[1]: 2.220446049250313e-16

17voto

Claudiu Points 58398

Ça fonctionnera déjà, comme l'a souligné David!

>>> 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X