Estou tentando entender o que é epsilon máquina. De acordo com a Wikipedia, pode ser calculado da seguinte forma:
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
No entanto, é adequado apenas para números de precisão dupla. Estou interessado em modificá-lo para suportar também números de precisão simples. Eu li que o numpy pode ser usado, principalmente nas numpy.float32
aulas. Alguém pode ajudar a modificar a função?
numpy.float32
como um argumento para a função!Respostas:
Uma maneira mais fácil de obter o epsilon da máquina para um determinado tipo de flutuador é usar
np.finfo()
:fonte
>>> print(np.finfo(np.float).eps) = 2.22044604925e-16
e>>> print(np.finfo(np.float64).eps) = 2.22044604925e-16
np.float
lugar, já que é apenas um apelido do Python embutidofloat
. Os floats do Python são de 64 bits (Cdouble
) em quase todas as plataformas.float
e,np.float64
portanto, geralmente têm precisão equivalente e, para a maioria dos propósitos, você pode usá-los de forma intercambiável. No entanto, eles não são idênticos -np.float64
é um tipo específico de numpy e umnp.float64
escalar tem métodos diferentes para umfloat
escalar nativo . Como você esperaria,np.float32
é um float de 32 bits.Outra maneira fácil de obter o epsilon é:
fonte
8./3 - 5./3 - 1
cede-eps
e4./3 - 1./3 - 1
rende zero e10./3 - 7./3 - 1
rende zero?numpy
componentes internos quando existe umanumpy
função existente para encontrar o épsilon.Já vai funcionar, como David apontou!
fonte
NameError
se a condiçãowhile
for satisfeita na primeira verificação, então provavelmente faz sentido fazermachine_epsilon = machine_epsilon_last = func(1)
na primeira instrução