सटीक खोए बिना IEEE 754 डबल प्रकार में संग्रहीत किया जा सकने वाला सबसे बड़ा "नो-फ्लोटिंग" पूर्णांक क्या है?
सटीक खोए बिना IEEE 754 डबल प्रकार में संग्रहीत किया जा सकने वाला सबसे बड़ा "नो-फ्लोटिंग" पूर्णांक क्या है?
जवाबों:
सटीक खोने के बिना एक डबल में संग्रहीत किया जा सकने वाला सबसे बड़ा / सबसे बड़ा पूर्णांक एक डबल के सबसे बड़े संभावित मूल्य के समान है। यही है, DBL_MAX
या लगभग 1.8 × 10 308 (यदि आपका डबल आईईईई 754 64-बिट डबल है)। यह एक पूर्णांक है। यह बिल्कुल प्रतिनिधित्व किया है। आपको और क्या चाहिए?
चलिए, मुझसे पूछें कि सबसे बड़ा पूर्णांक क्या है, जैसे कि यह और सभी छोटे पूर्णांक बिना सटीक खोए IEEE 64-बिट डबल्स में संग्रहीत किए जा सकते हैं। आईईईई 64-बिट डबल में मंटिसा के 52 बिट्स हैं, इसलिए मुझे लगता है कि यह 2 53 है :
या इसे देखने का एक और तरीका: एक बार पूर्वाग्रह को घातांक से हटा दिया गया है, और प्रश्न के लिए अप्रासंगिक के रूप में साइन बिट की अनदेखी करते हुए, एक डबल द्वारा संग्रहीत मूल्य 2 की शक्ति है, साथ ही 52-बिट पूर्णांक 2 से गुणा किया जाता है प्रतिपादक - ५२ । तो प्रतिपादक 52 के साथ 2 से सभी मूल्यों स्टोर कर सकते हैं 52 से 2 के माध्यम से 53 - 1. फिर प्रतिपादक 53 के साथ, अगले नंबर पर आप स्टोर कर सकते हैं 2 के बाद 53 2 53 + 1 × 2 52 - 53 । तो परिशुद्धता का नुकसान पहले 2 53 + 1 के साथ होता है ।
9007199254740992 (यह 9,007,199,254,740,992 है) कोई गारंटी नहीं :)
कार्यक्रम
#include <math.h>
#include <stdio.h>
int main(void) {
double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
while (dbl + 1 != dbl) dbl++;
printf("%.0f\n", dbl - 1);
printf("%.0f\n", dbl);
printf("%.0f\n", dbl + 1);
return 0;
}
परिणाम
9007199254740991 9007199254740992 9007199254740992
double dbl = 1; while (dbl + 1 != dbl) dbl *= 2; while (dbl == --dbl);
जो एक ही परिणाम पैदावार
while (dbl == --dbl)
हमेशा के लिए लूप करेंगे या बिल्कुल नहीं। :) (इस मामले में, बिल्कुल नहीं, क्योंकि यह 2 ^ एन है)। आपको नीचे से इसे अप्रोच करना होगा। यह वास्तव में अपेक्षित परिणाम से कम समय में परिणाम देगा (चूंकि लूप घटने के समय में एक चेक dbl)। और यह निष्पादन के आदेश पर निर्भर करता है, यदि कमी बाएं पक्ष के मूल्यांकन से पहले या बाद में की जाती है (जो कि अब तक अपरिभाषित है)। यदि यह पूर्व है, तो यह हमेशा हमेशा के लिए सत्य और लूप हो जाएगा।
while (dbl + 1 != dbl) dbl++;
है कि में dbl + 1 != dbl
का उपयोग कर मूल्यांकन कर सकते हैं long double
गणित - पर विचार FLT_EVAL_METHOD == 2
। यह एक अनंत लूप में समाप्त हो सकता है।
विकिपीडिया के पास IEEE 754 के लिंक के साथ एक ही संदर्भ में यह कहने के लिए है :
एक सामान्य कंप्यूटर सिस्टम पर, एक 'डबल सटीक' (64-बिट) बाइनरी फ्लोटिंग-पॉइंट संख्या में 53 बिट्स (जिनमें से एक निहित है) का गुणांक 11 बिट्स का एक घातांक और एक साइन बिट है।
2 ^ 53 बस 9 * 10 ^ 15 से अधिक है।
IEEE 754 डबल (64-बिट) में प्रतिनिधित्व किया जाने वाला सबसे बड़ा पूर्णांक वही सबसे बड़ा मान है जो प्रकार का प्रतिनिधित्व कर सकता है, क्योंकि यह मान स्वयं पूर्णांक है।
इसे 0x7FEFFFFFFFFFFFFF
निम्न के रूप में दर्शाया गया है , जो इस प्रकार है :
0x7FE
(2046 जो पूर्वाग्रह घटाए जाने के बाद 1023 का प्रतिनिधित्व करता है) के बजाय 0x7FF
(2047 जो एक NaN
या अनंत इंगित करता है )।0xFFFFFFFFFFFFF
जो कि 52 बिट्स 1 है।बाइनरी में, मान का मतलब 1 होता है जिसके बाद मंटिसा के एक और 52 लोग होते हैं, फिर घातांक से 971 शून्य (1023 - 52 = 971) होते हैं।
सटीक दशमलव मान है:
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
यह लगभग 1.8 x 10 308 है ।
आपको मंटिसा के आकार को देखने की जरूरत है। एक IEEE 754 64 बिट फ्लोटिंग पॉइंट नंबर (जिसमें 52 बिट्स, प्लस 1 इम्प्लाइड) है, पूर्णांक को 2 ^ 53 के बराबर या उससे कम के निरपेक्ष मान के साथ प्रस्तुत कर सकता है।
1.7976931348623157 × 10 ^ 308
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
DECIMAL_DIG
से <float.h>
कम से कम एक उचित अनुमान देना चाहिए। दशमलव अंक के साथ कि सौदों के बाद से, और यह वास्तव में बाइनरी में संग्रह किया गया है, तो आप शायद कुछ एक स्टोर कर सकते हैं थोड़ा परिशुद्धता खोने के बिना बड़ा है, लेकिन वास्तव में कैसे कुछ भी कहना मुश्किल है। मुझे लगता है कि आपको यह पता लगाने में सक्षम होना चाहिए FLT_RADIX
और DBL_MANT_DIG
, लेकिन मुझे यकीन नहीं है कि मैं पूरी तरह से परिणाम पर भरोसा करूंगा।
double
सीधे एक विशिष्ट IEEE प्रकार से मेल खाती है, लेकिन इसकी आवश्यकता नहीं है, और जब इस उत्तर को लिखा गया था तो किसी विशेष IEEE प्रकार का उल्लेख नहीं किया गया था।