2015-10-05 21 views
11

Trong khi tìm kiếm cho một số công cụ NumPy, tôi tình cờ gặp một câu hỏi thảo luận về tính chính xác làm tròn của numpy.dot():NumPy điểm nổi lỗi làm tròn

Numpy: Difference between dot(a,b) and (a*b).sum()

Kể từ khi tôi tình cờ có hai máy tính (khác nhau) với Haswell-CPU ngồi trên bàn của tôi, nên cung cấp FMAand tất cả mọi thứ, tôi nghĩ rằng tôi muốn kiểm tra ví dụ được đưa ra bởi Ophion trong câu trả lời đầu tiên, và tôi nhận được kết quả là hơi ngạc nhiên tôi:

Sau khi cập nhật/cài đặt/sửa chữa lapack/blas/atlas/numpy, tôi nhận được những điều sau đây trên cả hai máy:

>>> a = np.ones(1000, dtype=np.float128)+1e-14 
>>> (a*a).sum() 
1000.0000000000199999 
>>> np.dot(a,a) 
1000.0000000000199948 

>>> a = np.ones(1000, dtype=np.float64)+1e-14 
>>> (a*a).sum() 
1000.0000000000198 
>>> np.dot(a,a) 
1000.0000000000176 

Vì vậy, phép nhân + tổng hợp chuẩn() chính xác hơn np.dot(). Tuy nhiên, thời gian chờ xác nhận rằng phiên bản .dot() nhanh hơn (nhưng không nhiều) cho cả float64 và float128.

Có ai có thể giải thích về điều này không?

chỉnh sửa: Tôi vô tình xóa thông tin về các phiên bản khó khăn: kết quả tương tự cho 1.9.0 và 1.9.3 với trăn 3.4.0 và 3.4.1.

+1

Điều thú vị là tôi chỉ nhận được sự khác biệt này trên NumPy 1.9.2 chứ không phải NumPy 1.8.2. Cả hai đều sử dụng blas + lapack (không phải bản đồ). Với NumPy 1.8.2, kết quả giống hệt nhau với dấu chấm và tổng, cho thấy các sự kiện làm tròn giống hệt nhau, trên NumPy 1.9.2, phép nhân + tổng() chính xác hơn. –

+0

Xem http://docs.scipy.org/doc/numpy/release.html#better-numerical-stability-for-sum-in-some-cases –

+1

Ngoài ra https://github.com/numpy/numpy/pull/3685, là nơi thay đổi trong 'tổng hợp 'được thực hiện. –

Trả lời

2

Dường như gần đây họ đã thêm một số đặc biệt Pairwise Summation đến ndarray.sum để cải thiện tính ổn định số.

Từ PR 3685, điều này ảnh hưởng:

all add.reduce calls that go over float_add with IS_BINARY_REDUCE true 
so this also improves mean/std/var and anything else that uses sum. 

Xem here cho thay đổi mã.

+0

Thuật toán "phân chia và chinh phục". Vâng, điều đó có ý nghĩa, cảm ơn. –

+0

Điều này có nghĩa là chúng tôi thực sự tốt hơn trong việc sử dụng các chiến lược thay thế để tính toán ma trận hơn các chức năng tích hợp? Điều đó sẽ là mỉa mai, cho rằng mục đích vất vả là để giảm bớt công việc khoa học. –

Các vấn đề liên quan