precision - Is it possible to print a large number of digits of a floating point number with gmp? -
मैं प्रिंट करना चाहते हैं
1589128402970546000515214676475308953824987995059891920501615931630880
:
< P> 33877456965431938318210482471113262183356704085033125021829876006886584214655562/27714219875802356822746928595231875152809132048206089502588927मैं इसे जीएमपी पुस्तकालय के साथ करने की कोशिश करता हूं:
// gcc pc -lgmp #include & lt; stdio.h & gt; # शामिल करें & lt; gmp.h & gt; Int main (int argc, char ** argv) {mpf_set_default_prec (1024); // सेट बिट्स में डिफ़ॉल्ट सटीक // declare mpz_t zn; Mpz_t zd; Mpq_t q; Mpf_t fn; Mpf_t fd; Mpf_t f; // f = फ्लोट (q = n / d) // init mpz_init (zn); Mpz_init (zd); Mpq_init (q); Mpf_init2 (fn, 794564201485273000257607338237654476912493997529945960250807965815440); Mpf_init (fd); Mpf_init (f); // सेट mpz_set_str (Zn, "33877456965431938318210482471113262183356704085033125021829876006886584214655562", 10); // // mpz_set_ui (n, 33877456965431938318210482471113262183356704085033125021829876006886584214655562); चेतावनी: पूर्णांक निरंतर (zd, "237142198758023568227473377297792835283496928595231875152809132048206089502588927", 10) अपने प्रकार [डिफ़ॉल्ट रूप से सक्षम] mpz_set_str के लिए बहुत बड़ी है; mpq_set_str (क्यू, "33877456965431938318210482471113262183356704085033125021829876006886584214655562/237142198758023568227473377297792835283496928595231875152809132048206089502588927", 10); Mpf_set_z (fn, zn); Mpf_set_z (एफडी, zd); // mpf_div (f, fn, fd); // प्रिंट परिणाम gmp_printf ("दशमलव फ़्लोटिंग प्वाइंट नंबर:% .एफएफ \ n", f); // // स्पष्ट mpz_clear (zn); Mpz_clear (zd); mpq_clear (क्यू); Mpf_clear (fn); Mpf_clear (fd); Mpf_clear (f); वापसी 0;
}
लेकिन परिणाम केवल 22 दशमलव अंक है:
दशमलव फ़्लोटिंग बिंदु संख्या: 0.142857142857142857143
कैसे करना चाहिए मुझे यह करना है?
आपको अधिक दशमलव अंक प्राप्त करने के लिए सटीक (यानी मंटिसा बिट्स) को बढ़ाने की आवश्यकता है। राज्यों (जोर खान) के रूप में:
प्रत्येक फ्लोट के मंटिसा में एक उपयोगकर्ता-चयन योग्यता है, जो केवल उपलब्ध स्मृति द्वारा सीमित है प्रत्येक चर की अपनी सटीकता होती है, और यह किसी भी समय बढ़ सकता है या कम हो सकती है।
डिफ़ॉल्ट रूप से यह मंटिसा के लिए 64 बिट का चयन करता है, और मूल रूप से आप जो प्राप्त करते हैं वह है:
dig10 = floor (dig2 / log2 (10))
,
इस प्रकार आपके पास शुरुआत में केवल 1 9 महत्वपूर्ण, दशमलव अंक थे अधिक सटीकता का अनुरोध करके आप उनमें से अधिक प्राप्त कर सकते हैं:
#include & lt; stdio.h & gt; # शामिल करें & lt; gmp.h & gt; Int मुख्य (शून्य) {mpz_t zn, zd; Mpf_t fn, fd, f; mpf_set_default_prec (1024); mpz_init_set_str (Zn, "33877456965431938318210482471113262183356704085033125021829876006886584214655562", 10); mpz_init_set_str (zd, "237142198758023568227473377297792835283496928595231875152809132048206089502588927", 10); mpf_init (एफ एन); mpf_init (FD); mpf_init (च); Mpf_set_z (fn, zn); Mpf_set_z (एफडी, zd); Mpf_div (f, fn, fd); Gmp_printf ("दशमलव फ़्लोटिंग प्वाइंट नंबर:% .एफएफ \ n", f); वापसी 0; }
में परिणाम:
दशमलव चल बिन्दु संख्या: 0,1428571428571428571428571428571428571428571428571428571428571428571428571428571470740220344350664325965724776508647459411274100902601628882480671861148592450467118250772869175909603098316903937670228712738977340379914830920623570643668473851880233962854802649343258544237378422095661611829666642751471587447213
दशमलव के कुछ निश्चित राशि चाहते हैं अंक (और यह मानते हुए कि zn / zd
भागफल शून्य है) बस ऊपर (या कुछ और परिष्कृत) लॉगरिदमिक समीकरण का उपयोग करें।
Comments
Post a Comment