बहुत बड़ा फर्क।
जैसा कि नाम से ही स्पष्ट है, एक double
2x की सटीकता है [1] । सामान्य तौर पर सटीक के 15 दशमलव अंक होते हैं, जबकि 7 होते हैं।float
double
float
यहां बताया गया है कि अंकों की संख्या की गणना कैसे की जाती है:
double
52 मंटिसा बिट्स + 1 छिपे हुए बिट: लॉग (2 53 ) 10 लॉग (10) = 15.95 अंक हैं
float
में 23 मंटिसा बिट्स + 1 छिपा हुआ बिट है: लॉग (2 24 ) 10 लॉग (10) = 7.22 अंक
बार-बार गणना किए जाने पर यह सटीक हानि अधिक ट्रंकेशन त्रुटियों को जमा कर सकती है, जैसे
float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.7g\n", b); // prints 9.000023
जबकि
double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.15g\n", b); // prints 8.99999999999996
इसके अलावा, फ्लोट का अधिकतम मूल्य लगभग है 3e38
, लेकिन डबल के बारे में है 1.7e308
, इसलिए float
"इन्फिनिटी" (यानी एक विशेष फ्लोटिंग-पॉइंट संख्या) का उपयोग करके double
कुछ सरल की तुलना में बहुत अधिक आसानी से मारा जा सकता है, जैसे कि 60 के भाज्य की गणना करना।
परीक्षण के दौरान, शायद कुछ परीक्षण मामलों में ये विशाल संख्याएं होती हैं, जो आपके कार्यक्रमों को विफल कर सकती हैं यदि आप फ्लोट का उपयोग करते हैं।
बेशक, कभी-कभी, double
पर्याप्त रूप से सटीक भी नहीं होता है, इसलिए हमारे पास कभी-कभी long double
[1] (उपरोक्त उदाहरण मैक पर 9.000000000000000066 देता है), लेकिन सभी फ़्लोटिंग पॉइंट प्रकार राउंड-ऑफ त्रुटियों से ग्रस्त हैं , इसलिए यदि परिशुद्धता बहुत महत्वपूर्ण है (जैसे पैसा प्रसंस्करण) आपको int
एक अंश वर्ग का उपयोग करना चाहिए ।
इसके अलावा, +=
फ़्लोटिंग पॉइंट संख्याओं का योग करने के लिए उपयोग न करें , क्योंकि त्रुटियां जल्दी से जमा होती हैं। यदि आप पायथन का उपयोग कर रहे हैं, तो उपयोग करें fsum
। अन्यथा, कहन सारांश एल्गोरिदम को लागू करने का प्रयास करें ।
[१]: सी और सी ++ मानकों के प्रतिनिधित्व को निर्दिष्ट नहीं करते हैं float
, double
और long double
। यह संभव है कि तीनों को आईईईई डबल-परिशुद्धता के रूप में लागू किया जाए। फिर भी, अधिकांश आर्किटेक्चर (gcc, MSVC; x86, x64, ARM) के float
लिए वास्तव में IEEE सिंगल-प्रिसिजन फ़्लोटिंग पॉइंट नंबर (बाइनरी 32) है, और double
यह आईईईई डबल-प्रिसिजन फ़्लोटिंग पॉइंट नंबर (बाइनरी 64) है।