2013-11-22 46 views
5

चलिए, x एक पूर्णांक और y = x * x है।पूर्ण वर्गों के लिए सी ++ sqrt फ़ंक्शन परिशुद्धता

तो क्या यह गारंटी है कि sqrt(y) == x?

उदाहरण के लिए, मुझे यकीन है कि sqrt(25) या sqrt(25.0)5.0, नहीं 5.0000000003 या 4.999999998 वापस आ जाएगी हो सकता है?

+3

यदि 5 बिल्कुल प्रदर्शित नहीं किया जा सकता है, तो यह कैसे हो सकता है? सबसे अच्छा आप उम्मीद कर सकते हैं कि यह 5 तक गिर जाता है। – chris

+0

जैसा कि 5 एक पूर्णांक है, इसे बिल्कुल प्रदर्शित नहीं किया जाना चाहिए? मैंने कहीं कहीं पढ़ा है कि डबल पूरी तरह से पूर्णांक श्रेणी में मानों को संग्रहीत कर सकता है। –

+2

@ रफीकमाल: एक आईईईई -754 64-बिट डबल-प्रेसिजन फ्लोट बिना किसी नुकसान के 32-बिट हस्ताक्षरित और हस्ताक्षरित पूर्णांक की पूरी श्रृंखला का सटीक रूप से प्रतिनिधित्व कर सकता है। वह उस सटीक मामले में केवल प्रकार के रूपांतरणों को नियंत्रित करता है।यह फ़्लोटिंग पॉइंट लाइब्रेरी की सटीकता को नियंत्रित नहीं करता है जो 'sqrt (x)' की गणना करता है। –

उत्तर

4

नहीं, आपको गारंटी नहीं दी जा सकती है। पूर्णांक और उनके वर्गों के लिए जो फ़्लोटिंग पॉइंट प्रकार के मंटिसा की गतिशील रेंज में फिट होते हैं (एक सामान्य सी/सी ++ double के लिए 2^53), आप ठीक होने की संभावना रखते हैं, लेकिन जरूरी नहीं है।

आपको फ़्लोटिंग पॉइंट मानों और सटीक मानों, विशेष रूप से सटीक पूर्णांक मानों के बीच तुलना के बराबर तुलना करना चाहिए। फ़्लोटिंग पॉइंट राउंडिंग मोड और ऐसी अन्य चीजें वास्तव में आपके रास्ते में मिल सकती हैं।

आप या तो "लगभग बराबर" परिणाम स्वीकार करने के लिए "तुलना सीमा" का उपयोग करना चाहते हैं, या पूर्णांक के संदर्भ में अपने एल्गोरिदम को पुन: प्रस्तुत करना चाहते हैं। फ़्लोटिंग पॉइंट समानता तुलना को कवर करने वाले कई स्टैक ओवरफ़्लो प्रश्न हैं। मेरा सुझाव है कि आप उनके लिए खोज करें और पढ़ लें।

समस्या का एक निश्चित वर्ग के लिए, मैं यहाँ एक वैकल्पिक समाधान ऊपर लिखा है: Find n-th root of all numbers within an interval

समाधान मुश्किल चल बिन्दु गणित पर निर्भर की तुलना में एक अलग दृष्टिकोण लिया है।

8

बुनियादी संचालन के लिए अनुमत त्रुटियों पर आईईईई -754 मानक के अनुरूप एक कार्यान्वयन (जिसमें sqrt एक उदाहरण है) के लिए आवश्यक है कि मूल्य सही ढंग से गोल किए जाएं।
इसका मतलब है कि त्रुटि 1/2 यूएलपी (अंतिम स्थान पर इकाई) या मूल रूप से यथासंभव वास्तविक उत्तर के करीब होगी।

अपने प्रश्न का उत्तर देने के लिए, यदि वास्तविक उत्तर double द्वारा बिल्कुल प्रतिनिधित्व योग्य है तो आपको सटीक उत्तर मिलेगा।

नोट: यह सी ++ मानक द्वारा गारंटी नहीं है लेकिन आईईईई -754 मानक द्वारा, जो शायद अधिकांश लोगों के लिए कोई मुद्दा नहीं है।

अंत में, एक साधारण परीक्षण अपने उद्देश्यों के लिए पर्याप्त होना चाहिए:

for(int i = 0; i < (int)std::sqrt(std::numeric_limits<int>::max()); i++) 
    { 
     assert((int)(double)i == i);//Ensure exactly representable, because why not 
     assert(std::sqrt((double)i*i) == i); 
    } 

इस गुजरता है, मैं चिंता करने की कोई कारण नहीं दिख रहा है।

1

आपको बल को 2^26 तक आसानी से सभी मूल्यों को खोजने में सक्षम होना चाहिए, लेकिन मुझे विश्वास है कि उत्तर हाँ है। उस नंबर के बाद, नहीं।

वर्ग रूट के लिए अंक-दर-अंक पाठ्यपुस्तक एल्गोरिदम शेष == 0 के साथ समाप्त होता है, जो सटीक परिणाम देता है। फिर फिर यदि एक फ़्लोटिंग पॉइंट लाइब्रेरी का अर्थ है यानी -754 शिकायत, यह किसी भी अन्य माध्यम से यह मूल्य भी देगी।

संबंधित मुद्दे