J'essaie de comprendre ce qu'est la machine epsilon. Selon Wikipedia, il 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, il ne convient que pour les nombres à double précision. Je suis intéressé à le modifier pour prendre en charge également les nombres à simple précision. J'ai lu que numpy peut être utilisé, en particulier la numpy.float32
classe. Quelqu'un peut-il aider à modifier la fonction?
numpy.float32
comme argument à la fonction!Réponses:
Un moyen plus simple d'obtenir la machine epsilon pour un type de flotteur donné est d'utiliser
np.finfo()
:la source
>>> print(np.finfo(np.float).eps) = 2.22044604925e-16
et>>> print(np.finfo(np.float64).eps) = 2.22044604925e-16
np.float
place, car c'est juste un alias de la fonction intégrée de Pythonfloat
. Les flottants Python sont 64 bits (Cdouble
) sur presque toutes les plates-formes.float
et ontnp.float64
donc généralement une précision équivalente, et dans la plupart des cas, vous pouvez les utiliser de manière interchangeable. Cependant, ils ne sont pas identiques -np.float64
c'est un type spécifique à numpy, et unnp.float64
scalaire a des méthodes différentes d'unfloat
scalaire natif . Comme vous vous en doutez,np.float32
c'est un flottant 32 bits.Un autre moyen simple d'obtenir epsilon est:
la source
8./3 - 5./3 - 1
cède-t-il-eps
,4./3 - 1./3 - 1
donne zéro et10./3 - 7./3 - 1
rapporte zéro?numpy
internes lorsqu'il existe unenumpy
fonction existante pour trouver l'epsilon.Cela fonctionnera déjà, comme l'a souligné David!
la source
NameError
si la condition danswhile
sera satisfaite lors de la première vérification, il est donc probablement logique de le fairemachine_epsilon = machine_epsilon_last = func(1)
dans la première instruction