स्पॉटलाइट `cos (pi / 2)` के लिए गलत मान क्यों देता है?


8

जैसा कि आप जानते हैं, स्पॉटलाइट सरल गणित कर सकता है। उदाहरण के लिए, टाइपिंग cos(pi)में परिणाम होगा -1, जैसा कि आप उम्मीद कर सकते हैं। मैंने अभी टाइप किया है cos(pi/2), जो 0 होना चाहिए लेकिन इसने मुझे दिया -5e-12

हाँ, यह संभवतः एक गोल त्रुटि के कारण है, लेकिन चलो cos(pi/2):! मेरी राय में, यह स्पष्ट रूप से बग जैसा दिखता है। तुम क्या सोचते हो?


1
cos (x) एक पारलौकिक कार्य है। जब तक वे पी, पी / 2, आदि के लिए हार्डकोड मान नहीं करते, आपको कुछ त्रुटि की उम्मीद करनी चाहिए।
नवीन

@ नवीन वास्तव में मैं इन मूल्यों को कठिन-कोड करने की अपेक्षा करता हूं क्योंकि वे बहुत महत्वपूर्ण हैं।
पोइट्रोए

1
piखुद हार्ड-कोडेड होगा (जैसा कि आपको -1 मिलता है cos(pi)), लेकिन जैसे ही आप इसमें हेरफेर करते हैं, आपको एक फ्लोटिंग पॉइंट नंबर मिलता है, जो सीमित परिशुद्धता है। OSX हार्ड-कोड नहीं करता है pi/2, pi/4आदि, यह वास्तव में आपरेशन करता है।
१२'१४ को

2
@harryg राउंडिंग एरर हैं जिन्हें दशमलव पर स्विच करके हल किया जा सकता है, यह उनमें से एक नहीं है। यदि आप 0.1वास्तव में प्रतिनिधित्व करना चाहते हैं तो दशमलव उपयोगी है। ठीक है, लेकिन यह पीआई जैसी तर्कहीन संख्याओं के लिए उपयोगी नहीं है जो बाइनरी या दशमलव में बिल्कुल प्रतिनिधित्व नहीं कर सकते हैं।
कोडइन्चोस

1
संदर्भ के लिए, रूबी में:irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
harryg

जवाबों:


13

यह पीआई की सटीकता की कमी के कारण है और अंतर्निहित सिस्टम में सटीक सभी कमी के कारण है।

pi = 3.1415926536

pi/2 = 1.5707963268 

cos(1.5707963268) = -5.103412e-12

FYI =  5.103412e-12 = 0.000000000005103412 ~ 0 


समग्र प्रणाली परिशुद्धता के बारे में:

3.141592653589793238462643383 = 3.1415926536 

पायथन में हम निम्नलिखित हैं:

>>> float("3.141592653589793238462643383")
3.141592653589793

जैसा कि हम देख सकते हैं कि परिशुद्धता के साथ एक समस्या है क्योंकि यह फ्लोट प्रतिनिधित्व से मेल नहीं खाती है।


यह सटीकता की कमी के कारण है, लेकिन इस परिमाण की त्रुटि को फ्लोटिंग पॉइंट नंबरों पर दोष नहीं दिया जा सकता है।
डेनिस जहरुद्दीन

2
संभवत: यह पीआई मान के साथ सटीक की कमी है।
मैथ्यू रीगलर

5

वे असामान्य फ्लोटिंग-पॉइंट परिशुद्धता के साथ। स्टोर नहीं कर रहे हैं। वे दोहरी परिशुद्धता के साथ value के लिए गलत मान का उपयोग कर रहे हैं। 3.1415926536 बाइनरी में अनुमानित करने के लिए , कम से कम 38 बिट्स की आवश्यकता होती है:

3.14159265359922… > 11.001001000011111101101010100010001001

ध्यान दें कि 2 ^ -36 लगभग 1.5e-11 है, जो अनुगामी 99 के साथ मेल खाता है। डबल-सटीक फ़्लोटिंग-पॉइंट का 52-बिट महत्व है। cos(pi/2)-5 ई -12 के रूप में मूल्यांकन करने के लिए , केवल अन्य संभव विकल्प 48-बिट प्रकार होगा, जो बहुत ही अजीब होगा।

0 और where के पास, जहाँ व्युत्पन्न लगभग शून्य है, cos (cannot) की गणना बहुत सटीक नहीं की जा सकती है:

cos(3.1415926536) ≈ -0.999999999999999999999947911

यह -1 से लगभग 5.2e-23 से भिन्न है, जो कि, से छोटा है double, इसलिए cos(3.1415926536)इसकी गणना ठीक -1 के रूप में की जाती है ... जो कि गलत है।

Near- / 2 के पास, व्युत्पन्न [ -sin ( ] ) ] लगभग, 1 है, इसलिए इनपुट पर त्रुटि आउटपुट बन जाती है।

cos(1.57079632679961) ≈ -4.71338076867830836e-12
cos(1.57079632679962) ≈ -4.72338076867830836e-12
cos(1.57079632680000) ≈ -5.10338076867830836e-12

मेरे पास एक TI कैलकुलेटर है जो एक कम अंक प्रदर्शित करता है और cos(π/2)-5.2e-12 के रूप में गणना करता है। हालांकि, यह इलेक्ट्रॉनिक रूप से बहुत अलग है और इसके लिए एक सटीक मूल्य देने के लिए डिज़ाइन किया गया था cos(90°)

मुझे लगता है कि स्पॉटलाइट में, cos(pi/2)π के लिए एक मान प्राप्त करके गणना की जा रही है, दशमलव स्ट्रिंग में परिवर्तित करते हुए , यह कहते हुए कि (सटीक, तर्कसंगत) बाइनरी मान 11.00100100001111010101010101000100000000111101111 (या 10000), 2 से विभाजित, और फिर अनिवार्य रूप से घटाकर। सही मूल्य π / 2 की। आपको पता लगाना चाहिए कि क्या cos(pi/2 + cos(pi/2))यह शून्य के करीब है (यह -2.2e-35 हो सकता है)।

दो की शक्ति से गुणा केवल घातांक को प्रभावित करना चाहिए, महत्व को नहीं। यह निर्धारित करना संभव हो सकता है कि बार-बार आधा करने या दोहरीकरण द्वारा गोलाई कैसे लागू की जाती है।


मार्कडाउन के साथ कुछ भी गलत नहीं है - मैथजैक्स केवल मैथ-संबंधित साइटों पर सक्षम है, एसई-वाइड नहीं।
GRG

1
cos (pi / 2 + cos (pi / 2)) 0 बिल्कुल प्रदर्शित करता है।
निक मैट्टो

4

यह एक बग है जो 10.9.2 पर प्रतिलिपि प्रस्तुत करने योग्य है - और एक फ्लोटिंग पॉइंट राउंडिंग एरर जैसे कि काफी विशिष्ट है।

अगर मुझे लगता है कि यह पर्याप्त सटीकता के बिना संभाला जा रहा है तो पाई का मूल्य है।

  • cos (999999 * pi) में कोई त्रुटि नहीं है
  • cos (999999 + 1) * pi में त्रुटि है - संभावना पूर्णांक

यदि आप Apple के बग फिक्सिंग एक्शन को देखना चाहते हैं, तो मैं https://developer.apple.com/bug-reporting/ पर जाऊंगा।


5
क्या यह एक बग है, वास्तव में? ऐसे ऑपरेशन पर क्या सटीकता होनी चाहिए?
.douard

मैं एक पंजीकृत डेवलपर नहीं हूं, लेकिन अगर आप इसे हमारे लिए प्रस्तुत कर सकते हैं तो मैं बहुत आभारी रहूंगा!
२२:०४ पर कविता

4
@ Ifdouard आप इसे एक बग मान सकते हैं यदि उपयोगकर्ता को प्रतीकात्मक गणित के लिए कुछ क्षमता की उम्मीद करने के लिए नेतृत्व किया गया है। किसी भी कंप्यूटर बीजगणित प्रणाली (CAS) को निश्चित रूप से पता होगा कि cos (2/2) = 0 बिल्कुल! दूसरी ओर, स्पॉटलाइट द्वारा कैस की अपेक्षा करना शायद ही उचित है। और फ्लोटिंग पॉइंट अंकगणित के दायरे में, ओपी रिपोर्ट जैसे परिणामों की उम्मीद की जानी है। किसी भी बग रिपोर्ट को बेहतर ढंग से एक फीचर अनुरोध लेबल किया जा सकता है, शायद।
हेराल्ड हेंच-ऑलसेन

1
@ Thatdouard bmike वास्तव में सही है कि यह बग है और केवल राउंडऑफ़ त्रुटि नहीं है। इस तरह के ऑपरेशन की अपेक्षित सटीकता, मानक डबल परिशुद्धता अंकगणित, 10 ^ -16 के बारे में है, न कि 10 ^ -12। आप अपनी पसंदीदा भाषा में एक प्रोग्राम लिखकर इसे स्वयं आज़मा सकते हैं जो सीपीयू के फ्लोटिंग पॉइंट सपोर्ट का लाभ उठाता है, गणना कर रहा है, और परिणाम के बिट पैटर्न की जांच कर रहा है। जैसा कि bmike कहता है, संभावित कारण यह है कि स्पॉटलाइट का उपयोग करने वाला मान पर्याप्त सटीकता के साथ परिभाषित नहीं किया गया है।
स्ज़बोलक्स

2
यहाँ कुछ अजीब चल रहा है। cos(2*acos(0)*0.5)कई ऑर्डर देता है 10^-10। इसलिए ऐसा नहीं है क्योंकि is स्थिरांक पर्याप्त सटीक नहीं है। मैं इस परिणाम की व्याख्या नहीं कर सकता: यह दोहरी परिशुद्धता के लिए बहुत अचूक है और एकल परिशुद्धता के लिए बहुत सटीक है।
स्ज़बोल्स्क

4

अन्य उत्तरों और टिप्पणियों से निम्नलिखित स्पष्ट हो जाते हैं:

तथ्य यह है कि आप एक गैर-परिणाम प्राप्त करते हैं एक बग नहीं है, यहां तक ​​कि सॉफ्टवेयर के एक पूर्ण कार्यान्वयन के साथ आप अस्थायी बिंदु गणना की सीमा में चले जाएंगे। हालांकि, 10 ^ -12 के क्रम में त्रुटि वास्तव में बड़ी है।

यह फ्लोटिंग पॉइंट नंबरों की अशुद्धि को दोष देने के लिए नहीं है। आपको मिलने वाला परिणाम सिर्फ यह है:

cos(1.5707963268)

कि किसी भी वैकल्पिक सॉफ्टवेयर पैकेज का उपयोग करके मान्य किया जा सकता है। यदि आप cos(pi/2)उन पैकेजों में से एक में मूल्यांकन करना चाहते थे, तो आपको निश्चित रूप से 10 ^ -12 की तुलना में शून्य के करीब परिणाम मिलेगा।

निष्कर्ष निकालने के लिए मुझे दो संभावित सीमाएँ दिखाई देती हैं, जिनमें से एक को लागू करना होगा:

  1. पाई पर्याप्त परिशुद्धता के साथ संग्रहीत नहीं है, या अपर्याप्त परिशुद्धता में कम से कम pi / 2 परिणाम है
  2. Cos बस इनपुट के रूप में अपर्याप्त परिशुद्धता लेता है

शायद सॉफ़्टवेयर के लिए कोई व्यक्ति इनमें से कौन सा लागू होता है को मान्य कर सकता है।

अद्यतन जैसा कि टिप्पणी में बताया गया है कि समस्या स्थिरांक की सटीकता प्रतीत होती है pi


यह अजीब है। जब आप पाई / 2 की गणना करते हैं तो 1.5707963268 परिणाम होता है। कुछ सरल कोशिशों के बाद, ऐसा लगता है कि स्पॉटलाइट 1 से नीचे की संख्या के लिए संख्या के लिए 10 महत्वपूर्ण अंक प्रदर्शित करता है और ऊपर संख्या के लिए 11। लेकिन किस अजीब कार्यान्वयन के कारण के बजाय गणना के अंदर एक गोल कदम लागू किया जाएगा ?
.दौर्ड

1
मैं यह भी बताना चाहता था कि यदि आप अधिक सटीक सन्निकटन pi / 2 के साथ स्पॉटलाइट प्रदान करते हैं (वुल्फराम अल्फा से 10 से अधिक अंकों को कॉपी-पेस्ट करके, जैसे), सटीक बढ़ता है।
.दो

मेरे अनुमान की पुष्टि करने के लिए धन्यवाद कि ओपी के प्रश्न में पी 0 की सटीकता 0 और मोटे तौर पर 10 ^ -12 के बीच त्रुटि का कारण थी।
bmike

आप इसे कितनी बार देखते हैं: "10 ^ -12 वास्तव में बहुत बड़ा है"
GEdgar

2

यह देखते हुए कि -5e-12है एक verryyyy छोटी संख्या, इस है एक गोलाई त्रुटि।

मुझे लगता है कि यह piस्थिरांक की तुलना में अधिक डेसीमल दिखाने वाली स्पॉटलाइट का परिणाम है, जो ट्रिगर फ़ंक्शंस की गणना करने के लिए उपयोग की गई निरंतर या अनंत श्रृंखला की तुलना में है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.