2012-05-24 15 views
20

क्या हैस्केल में round फ़ंक्शन के लिए कोई आधिकारिक विनिर्देशन है? GHCi संस्करण 7.0.3 में मैं निम्नलिखित व्यवहार देखें:निकटतम पूर्णांक के लिए गोल

ghci> round (0.5 :: Double) 
0 
ghci> round (1.5 :: Double) 
2 

दोनों 0.5 और 1.5 के बाद से प्रदर्शनीय हैं बिल्कुल के रूप में चल बिन्दु संख्या, मैं अजगर के समान ही व्यवहार को देखने के लिए उम्मीद:

>>> round(0.5) 
1.0 
>>> round(1.5) 
2.0 

क्या अंतर के लिए कोई तर्क है, या यह जीएचसीआई का एक कर्कश है?

+5

ध्यान दें कि पायथन 3 यहां जीएचसीआई के समान व्यवहार करता है। –

+0

दिलचस्प, धन्यवाद। क्या आपको पता है कि क्यों आईईईई भी संख्या तक घूमता है? यह मेरे लिए अनजान प्रतीत होता है - या तो गोल से ऊपर या गोल से दूर या तो अधिक समझ में आता है। –

+1

मुझे लगता है कि यह अधिक संभावना है कि यदि आप संख्याओं का एक गुच्छा गोल करते हैं और फिर उन्हें जोड़ते हैं तो गोल करने वाली त्रुटियां रद्द हो जाएंगी ... –

उत्तर

23

यह विनिर्देशन में है। आप the Haskell report की धारा 6.4.6 में देख सकते हैं:

round xx को निकटतम पूर्णांक देता है, यहां तक ​​कि पूर्णांक अगर x दो पूर्णांकों के बीच समान दूरी पर स्थित है।

जैसा कि @dflemstr द्वारा इंगित किया गया है, यह IEEE Standard for Floating-Point Arithmetic के अनुसार है।

+4

यह आईईईई 754 फ्लोटिंग पॉइंट राउंडिंग मोड मानक के अनुसार है। – dflemstr

+0

यदि कोई दिलचस्पी लेता है तो 'राउंड' के लिए कोड यहां दिया गया है: http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC-Real.html# यहां तक ​​कि चेक के लिए भी काफी है वहां स्पष्ट है। – Poindexter

+2

एफडब्ल्यूआईडब्ल्यू, तुलना के लिए, पायथन राउंड() सी 99 राउंड() फ़ंक्शन के चारों ओर एक रैपर है, जो सी 99 एनेक्स एफ राउंड का पालन करने वाले कार्यान्वयन पर शून्य से दूर है। – janneb