2011-02-19 12 views
8

जब अभिव्यक्ति का मूल्यांकन:हास्केल: अभिव्यक्ति के लिए अप्रत्याशित उत्पादन [0, 0.1 .. 1]

*main> [0, 0.1 .. 1] 

मैं वास्तव में उम्मीद कर रहा था:

[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] 

लेकिन मैं काफी उत्पादन को देखने के लिए झटका लगा जा

[0.0,0.1,0.2,0.30000000000000004,0.4000000000000001,0.5000000000000001,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0] 

क्यों हास्केल पर कि परिणाम उपज है मूल्यांकन?

+0

संभावित डुप्लिकेट [ghci क्यों कहते हैं कि 1.1 + 1.1 + 1.1> 3.3 सही है?] (Http://stackoverflow.com/questions/2038647/why-does-ghci-say-that-1-1- 1-1-1-1-3-3-is-true) – Gabe

+0

@TomMD, @Avilo: स्पष्टीकरण लड़कों के लिए धन्यवाद लेकिन मेरा यह भी अर्थ था कि यह थोड़ा अजीब लगता है कि उदाहरण के लिए 0.3 .... 0004 और .5 , .6, .7 0001 में सभी अंत जबकि .2, .8 और .9 "राउंड" हैं। यह लगातार निरंतर प्रतीत नहीं होता है, मुझे नहीं पता कि मैं खुद को समझा रहा हूं या नहीं। – Carlos

+1

@carlos जब आप सीखते हैं कि कैसे फ़्लोटिंग पॉइंट का प्रतिनिधित्व किया जाता है तो यह सही मायने रखता है। ध्यान दें सटीक मूल्य दो की नकारात्मक शक्ति के बराबर हैं। –

उत्तर

19

यह floating point मानों की अपर्याप्तता का परिणाम है, यह हास्केल के लिए विशेष नहीं है। आप सन्निकटन चल बिन्दु में निहित के साथ सौदा नहीं कर सकते हैं तो आप एक उच्च प्रदर्शन कीमत पर Rational उपयोग कर सकते हैं:

> import Data.Ratio 
Data.Ratio> [0,1%10.. 1%1] 
[0 % 1,1 % 10,1 % 5,3 % 10,2 % 5,1 % 2,3 % 5,7 % 10,4 % 5,9 % 10,1 % 1] 

बस बिंदु घर हथौड़ा, यहां अजगर है:

>>> 0.3 
0.29999999999999999 

और यहाँ है सी:

void main() { printf("%0.17f\n",0.3); } 

$ gcc t.c 2>/dev/null ; ./a.out 
0.29999999999999999 
3

this other post का संदर्भ लें। जैसा कि यह कहता है, सीपीयू में फ्लोटिंग पॉइंट नंबर सटीक नहीं हैं।

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