2011-10-05 16 views
6

अगला कोड मुझे देता है परिणाम में 5.999999999999998, लेकिन सही जवाब 6.प्रेसिजन Erlang में

Alpha = math:acos((4*4 + 5*5 - 3*3)/(2*4*5)) 
Area = 1/2 * 4 * 5 * math:sin(Alpha) 

है यह 6 पाने के लिए संभव है?

+5

फ़्लोटिंग-पॉइंट अंकगणित का उपयोग करते समय आपको सटीक परिणाम प्राप्त करने की गारंटी नहीं है। इस विषय को कई बार, कई बार पहले से ही कवर किया गया है। – Nayuki

उत्तर

23

आप एक समस्या इतना आम यह अपने आप वेब साइट, What Every Programmer Should Know About Floating-Point Arithmetic है कि में चलाने की है के साथ। समस्या एफपी अंकगणित का समर्थन करने वाले बाजार पर हर सीपीयू में बहुत अधिक फ्लोटिंग-पॉइंट अंकगणितीय कार्यों के कारण है; यह Erlang के लिए विशिष्ट नहीं है।

यदि नियमित फ़्लोटिंग पॉइंट अंकगणित आपको सटीकता या सटीकता प्रदान नहीं करता है, तो आप अंतर्निहित अंकगणितीय के बजाय मनमानी सटीक अंकगणितीय पुस्तकालय का उपयोग कर सकते हैं। शायद सबसे प्रसिद्ध ऐसी लाइब्रेरी GMP है, लेकिन आपको इसे एरलांग से उपयोग करने के लिए NIFs में लपेटना होगा।

at least one pure-Erlang alternative है, लेकिन मुझे इसका कोई अनुभव नहीं है, इसलिए मैं व्यक्तिगत रूप से इसका समर्थन नहीं कर सकता।

+0

यह निश्चित रूप से फ़्लोटिंग-पॉइंट अंकगणित करने वाले किसी के लिए पढ़ा जाना चाहिए। – rvirding

+0

लिंक – Yola

+0

@WarrenYoung के लिए बहुत बढ़िया धन्यवाद जानकारी के लिए धन्यवाद, मैंने खोज की और मुझे यह पता चला: https://github.com/tim/erlang-decimal लेकिन मुझे यकीन नहीं है कि सक्रिय विकास में है, लेकिन कुछ लोगों के बदलाव और नई सुविधाओं के साथ कांटा है। – JHG

8

गणना आपके हार्डवेयर पर मानक फ़्लोटिंग पॉइंट अंकगणित का उपयोग करके की जाती है। कभी-कभी गोल करने वाली त्रुटियां दिखाई देती हैं।

क्या आपको वास्तव में 15 अंकों की सटीकता की आवश्यकता है?

एक अधिक "सटीक" मूल्य प्राप्त करने के लिए वहाँ कई विकल्प हैं:

> round(Area). % Will round to integer 
6 

या आप कुछ सटीक

round(Area * 10000000)/10000000. 
6.0 

पर पूर्णांक सकता उद्देश्य मूल्य मुद्रित करने के लिए है, तो साथ मुद्रण है फ्लोट्स के लिए डिफ़ॉल्ट आउटपुट आपको कम परिशुद्धता देता है।

io:format("~f~n", [Area]). 
6.000000 
ok 

या एक विशिष्ट परिशुद्धता

io:format("~.14f~n", [Area]). 
6.00000000000000 
ok 

HTH