2015-11-03 4 views
5

मैं भौतिक प्रयोगों का अनुकरण चला रहा हूं, इसलिए मुझे वास्तव में उच्च फ़्लोटिंग पॉइंट परिशुद्धता (16 अंकों से अधिक) की आवश्यकता है। मैं Boost.Multiprecision का उपयोग करता हूं, हालांकि मुझे 16 अंकों से अधिक सटीकता नहीं मिल सकती है, इससे कोई फर्क नहीं पड़ता कि मैंने क्या प्रयास किया। मैं सी ++ और ग्रहण संकलक के साथ सिमुलेशन चलाने के लिए, उदाहरण के लिए:बूस्ट लिब (उच्चतर 16 अंकों) का उपयोग कर उच्च परिशुद्धता फ़्लोटिंग पॉइंट

#include <boost/math/constants/constants.hpp> 
#include <boost/multiprecision/cpp_dec_float.hpp> 
#include <iostream> 
#include <limits> 

using boost::multiprecision::cpp_dec_float_50; 

void main() 
{ 
    cpp_dec_float_50 my_num= cpp_dec_float_50(0.123456789123456789123456789); 
    std::cout.precision(std::numeric_limits<cpp_dec_float_50>::digits10); 
    std::cout << my_num << std::endl; 
} 

उत्पादन होता है:

0.12345678912345678379658409085095627233386039733887 
       ^

लेकिन यह होना चाहिए:

0.123456789123456789123456789 

आप देख सकते हैं, 16 के बाद अंक गलत है। क्यूं कर?

उत्तर

11

आपका यहां मुद्दा यह है:

cpp_dec_float_50 my_num = cpp_dec_float_50(0.123456789123456789123456789); 
              ^// This number is a double! 

संकलक मनमाना परिशुद्धता का उपयोग नहीं करता चल बिन्दु शाब्दिक, और बदले आईईईई-754 युगल, जो परिमित सटीक उपयोग करता है। इस मामले में, सबसे करीब double संख्या लिखा है आप के लिए है:

0.1234567891234567837965840908509562723338603973388671875 

और 50 वीं दशमलव करने के लिए इसे मुद्रण वास्तव में उत्पादन आप देख रहे हैं देता है।

क्या आप चाहते हैं एक स्ट्रिंग से अपने मनमाने ढंग से परिशुद्धता नाव के निर्माण के लिए है बजाय (demo):

#include <boost/math/constants/constants.hpp> 
#include <boost/multiprecision/cpp_dec_float.hpp> 
#include <iostream> 
#include <limits> 

using boost::multiprecision::cpp_dec_float_50; 

int main() { 
    cpp_dec_float_50 my_num = cpp_dec_float_50("0.123456789123456789123456789"); 
    std::cout.precision(std::numeric_limits<cpp_dec_float_50>::digits10); 
    std::cout << my_num << std::endl; 
} 

आउटपुट:

0.123456789123456789123456789 
2

समस्या यह है कि संकलन करते समय सी ++ कंपाइलर संख्याओं को दोगुना कर देता है (मैं कुछ समय पहले भी learned)। आपको अधिक दशमलव बिंदुओं को संभालने के लिए विशेष कार्यों का उपयोग करना होगा। उदाहरण के लिए SO पर Boost documentation या अन्य answers देखें।

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

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