Saya mencoba memahami apa itu mesin epsilon. Menurut Wikipedia, itu dapat dihitung sebagai berikut:
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
Namun, ini hanya cocok untuk angka presisi ganda. Saya tertarik untuk memodifikasinya untuk mendukung juga angka presisi tunggal. Saya membaca bahwa numpy dapat digunakan, terutama di numpy.float32
kelas. Adakah yang bisa membantu dengan memodifikasi fungsi?
numpy.float32
sebagai argumen ke fungsi!Jawaban:
Cara yang lebih mudah untuk mendapatkan mesin epsilon untuk tipe float tertentu adalah dengan menggunakan
np.finfo()
:sumber
>>> print(np.finfo(np.float).eps) = 2.22044604925e-16
dan>>> print(np.finfo(np.float64).eps) = 2.22044604925e-16
np.float
sebagai gantinya, karena ini hanya alias dari bawaan Pythonfloat
. Float Python 64-bit (Cdouble
) di hampir semua platform.float
dannp.float64
karena itu biasanya memiliki presisi yang setara, dan untuk sebagian besar tujuan Anda dapat menggunakannya secara bergantian. Namun keduanya tidak identik -np.float64
merupakan tipe khusus numpy, dannp.float64
skalar memiliki metode yang berbeda denganfloat
skalar asli . Seperti yang Anda harapkan,np.float32
ini adalah float 32-bit.Cara lain yang mudah untuk mendapatkan epsilon adalah:
sumber
8./3 - 5./3 - 1
menghasilkan-eps
, dan4./3 - 1./3 - 1
menghasilkan nol, dan10./3 - 7./3 - 1
menghasilkan nol?numpy
internal ketika adanumpy
fungsi yang ada untuk menemukan epsilon.Itu sudah akan berhasil, seperti yang ditunjukkan David!
sumber
NameError
jika kondisi dalamwhile
akan dipenuhi pada pemeriksaan pertama, jadi mungkin masuk akal untuk dilakukanmachine_epsilon = machine_epsilon_last = func(1)
dalam pernyataan pertama