trăn numpy máy epsilon


103

Tôi đang cố gắng hiểu epsilon máy là gì. Theo Wikipedia, nó có thể được tính như sau:

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

Tuy nhiên, nó chỉ phù hợp với các số chính xác gấp đôi. Tôi quan tâm đến việc sửa đổi nó để hỗ trợ các số chính xác đơn lẻ. Tôi đọc rằng numpy có thể được sử dụng, đặc biệt là numpy.float32lớp học. Ai có thể giúp sửa đổi chức năng?


8
Chức năng đó đủ chung để hoạt động với tất cả các khu vực. Chỉ cần truyền a numpy.float32làm đối số cho hàm!
David Zwicker

Câu trả lời:


192

Một cách dễ dàng hơn để có được epsilon của máy cho một loại phao nhất định là sử dụng np.finfo():

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

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

3
chỉ để tự tin 100%, câu hỏi đầu tiên cung cấp độ chính xác "tiêu chuẩn" của python về phao bẩm sinh trong khi câu thứ hai cung cấp độ chính xác của phao nổi của numpy?
Charlie Parker

2
lưu ý rằng độ chính xác tiêu chuẩn của numpy là 64 (trong máy tính 64 bit): >>> print(np.finfo(np.float).eps) = 2.22044604925e-16>>> print(np.finfo(np.float64).eps) = 2.22044604925e-16
Charlie Parker

2
@CharlieParker mà tôi có thể đã sử dụng np.floatđể thay thế, vì nó chỉ là một bí danh của nội dung Python float. Python float là 64-bit (C double) trên hầu hết các nền tảng. floatnp.float64do đó thường có độ chính xác tương đương, và cho hầu hết các mục đích, bạn có thể sử dụng chúng thay thế cho nhau. Tuy nhiên, chúng không giống nhau - np.float64là một kiểu cụ thể của numpy và một np.float64đại lượng vô hướng có các phương thức khác với một floatđại lượng vô hướng gốc . Như bạn mong đợi, np.float32là một phao 32 bit.
ali_m

92

Một cách dễ dàng khác để có được epsilon là:

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

4
Vâng, và tại sao 8./3 - 5./3 - 1lợi nhuận -eps, và kết 4./3 - 1./3 - 1quả bằng không, và kết 10./3 - 7./3 - 1quả bằng không?
Steve Tjoa

20
À, câu trả lời là đây, Bài toán 3: rstudio-pubs-static.s3.amazonaws.com/… Về cơ bản, nếu bạn trừ biểu diễn nhị phân của 4/3 từ 7/3, bạn sẽ có được định nghĩa của máy epsilon. Vì vậy, tôi cho rằng điều này nên giữ cho bất kỳ nền tảng nào.
Steve Tjoa

13
Đây là một câu trả lời quá bí truyền đòi hỏi quá nhiều kiến ​​thức về Python và numpynội bộ khi có một numpychức năng hiện có để tìm epsilon.
Olga Botvinnik

29
Câu trả lời này không yêu cầu bất kỳ kiến ​​thức nào về Python hoặc nội bộ numpy.
GuillaumeDufay

5
Thật vậy, nó khẳng định rằng người đọc biết về Python chạy trên các máy tính không sử dụng tính toán cơ sở 3 cơ bản.
kokociel,

17

Nó sẽ hoạt động, như David đã chỉ ra!

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

btw chức năng của bạn sẽ tăng NameErrornếu tình trạng whilesẽ được thỏa mãn trên tờ séc đầu tiên, vì vậy nó có thể làm cho tinh thần để làm machine_epsilon = machine_epsilon_last = func(1)trong báo cáo kết quả đầu tiên
Azat Ibrakov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.