2013-03-11 5 views
5

मैं जाओजाओ नाव संख्या प्रभाग

w:=float64(2.4) 
fmt.Println(math.Floor(w/0.8),math.Floor(2.4/0.8)) 

में 2.4/0.8 == 3 प्राप्त करने की कोशिश यह देता है मुझे "2 3"।

सवाल यह है कि math.Floor(w/0.8) मुझे नहीं देगा 3. क्या यह फ्लोट नंबर की सटीक सीमा है?

+0

अच्छी तरह से, मैं इसे खिसकाने के लिए मुझे 3 देना है, इसलिए मैंने किया: यहाँ अपने ही समाधान है 'स्थिरांक नज = 1e-10' और' math.Floor (0.8 डब्ल्यू/+ नज) ' –

उत्तर

9

प्रोग्राम आउटपुट सही है। आईईईई प्रारूप में कई वास्तविक संख्याओं का प्रतिनिधित्व सटीक नहीं है। पहला नंबर वास्तव में (इसके 64 बिट संस्करण में) 3 से कम है, इसलिए फर्श रिटर्न '2' सही ढंग से होता है। दूसरी परिशुद्धता का उपयोग करके संकलन समय पर गणना की जाती है।

reading की सिफारिश की गई।

7

हां, यह सटीक सीमा है। float64 बहुत सटीक है, लेकिन 2.4 बाइनरी में बिल्कुल संग्रहीत नहीं किया जा सकता है। जब दोनों संख्याएं स्थिरांक होती हैं, तो गणना संकलन समय पर उच्च परिशुद्धता में की जाती है, और जब परिणाम फ्लोट 64 के लिए गोल होता है, तो यह बिल्कुल 3 पर आता है। लेकिन जब संख्याओं में से कोई एक चर होता है, तो गणना की जानी चाहिए रनटाइम पर, और यह 2.99 99 99 99 99 99 99 6 तक आता है, जो फ़्लोर 2 तक गिर जाता है।

0

हालांकि यह सवाल का जवाब नहीं देता है (क्यों) मुझे यह पृष्ठ एक गोल समारोह की तलाश में मिला है, इसलिए अगर किसी को यह उपयोगी लगता है

func Round(val float64) (float64) { 
     if float64(int(val)) < val { 
      return float64(int(val) + 1) 
     } 
     return val 
    } 
+1

यह एक गोल समारोह नहीं है। यह एक सही छत समारोह भी नहीं है। गणित पुस्तकालय का प्रयोग करें। – JimB

+0

यह मेरे मामले के लिए एक सही छत समारोह था। मुझे x.x से x + 1 तक गोल करने की आवश्यकता है, इसलिए यहां फ़ंक्शन है। गणित पुस्तकालय ने ऐसा कोई कार्य नहीं दिया। मैंने इसे पहले से ही चेक किया है। – hey

+0

फिर इसे छत न करें अगर यह एक छत समारोह है। यह नकारात्मक, इंफ या नाएन को संभाल नहीं करता है। भी [गणित। सेइल] (http://golang.org/pkg/math/#Ceil)। – JimB