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.
Đ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. –
Xem http://docs.scipy.org/doc/numpy/release.html#better-numerical-stability-for-sum-in-some-cases –
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. –