[python] 파이썬 numpy 기계 엡실론

나는 기계 입실론이 무엇인지 이해하려고 노력하고 있습니다. Wikipedia에 따르면 다음과 같이 계산할 수 있습니다.

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

그러나 배정 밀도 숫자에만 적합합니다. 단 정밀도 숫자도 지원하도록 수정하는 데 관심이 있습니다. numpy, 특히 numpy.float32클래스를 사용할 수 있다는 것을 읽었습니다 . 아무도 함수 수정에 도움을 줄 수 있습니까?



답변

주어진 float 유형에 대해 기계 엡실론을 얻는 더 쉬운 방법은 다음을 사용하는 것입니다 np.finfo().

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

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


답변

엡실론을 얻는 또 다른 쉬운 방법은 다음과 같습니다.

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


답변

데이비드가 지적했듯이 이미 작동합니다!

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


답변