बुनियादी संचालन के लिए अनुमत त्रुटियों पर आईईईई -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);
}
इस गुजरता है, मैं चिंता करने की कोई कारण नहीं दिख रहा है।
यदि 5 बिल्कुल प्रदर्शित नहीं किया जा सकता है, तो यह कैसे हो सकता है? सबसे अच्छा आप उम्मीद कर सकते हैं कि यह 5 तक गिर जाता है। – chris
जैसा कि 5 एक पूर्णांक है, इसे बिल्कुल प्रदर्शित नहीं किया जाना चाहिए? मैंने कहीं कहीं पढ़ा है कि डबल पूरी तरह से पूर्णांक श्रेणी में मानों को संग्रहीत कर सकता है। –
@ रफीकमाल: एक आईईईई -754 64-बिट डबल-प्रेसिजन फ्लोट बिना किसी नुकसान के 32-बिट हस्ताक्षरित और हस्ताक्षरित पूर्णांक की पूरी श्रृंखला का सटीक रूप से प्रतिनिधित्व कर सकता है। वह उस सटीक मामले में केवल प्रकार के रूपांतरणों को नियंत्रित करता है।यह फ़्लोटिंग पॉइंट लाइब्रेरी की सटीकता को नियंत्रित नहीं करता है जो 'sqrt (x)' की गणना करता है। –