जबकि कुछ numpy सामान के लिए खोज, मैं) numpy.dot की गोलाई सटीकता (चर्चा कर एक सवाल भर में आया था:Numpy चल बिन्दु राउंडिंग त्रुटियों
Numpy: Difference between dot(a,b) and (a*b).sum()
जब से मैं दो (भिन्न) कंप्यूटर के लिए हो हैसवेल-सीपीयू मेरे डेस्क पर बैठे हैं, जो एफएमएंड सबकुछ प्रदान करना चाहिए, मैंने सोचा कि मैं पहले जवाब में ओफियन द्वारा दिए गए उदाहरण का परीक्षण करूंगा, और मुझे नतीजा हुआ कि मुझे कुछ आश्चर्य हुआ:
अद्यतन/स्थापित करने/लापैक/ब्लास/एटलस/numpy फिक्सिंग, मुझे दोनों मशीनों पर निम्नलिखित मिलता है:
>>> 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
तो मानक गुणा + sum() np.dot() से अधिक सटीक है। टाइमिट ने हालांकि पुष्टि की कि .dot() संस्करण फ्लोट 64 और फ्लोट 128 दोनों के लिए तेज़ (लेकिन अधिक नहीं) है।
क्या कोई इस के लिए स्पष्टीकरण प्रदान कर सकता है?
संपादित करें: मैंने आकस्मिक रूप से numpy संस्करणों पर जानकारी हटा दी: एक ही परिणाम 1.9.0 और 1.9.3 के साथ पायथन 3.4.0 और 3.4.1 के साथ।
दिलचस्प बात यह है कि मुझे केवल NumPy 1.9.2 पर यह विसंगति मिलती है, न कि NumPy 1.8.2। दोनों ब्लैस + लैपैक (एटलस नहीं) का उपयोग करते हैं। NumPy 1.8.2 के साथ, परिणाम डॉट और योग के समान हैं, समान गोलिंग घटनाओं का सुझाव देते हैं, NumPy 1.9.2 पर, गुणा + sum() अधिक सटीक है। –
देखें http://docs.scipy.org/doc/numpy/release.html#better-numerical-stability-for-sum-in-some-cases –
भी https://github.com/numpy/numpy/pull/3685, जहां 'राशि' में परिवर्तन लागू किया गया था। –