2017-09-19 3 views
5

निम्नलिखित कोड https://kotlinlang.org/docs/reference/functions.html?q=&p=0क्या मैं तुलना कर सकता हूं कि कोटलिन में दो फ़्लोटिंग-पॉइंट नंबर बराबर हैं या नहीं?

यह कोड कोसाइन के फिक्सपॉइंट की गणना करता है, जो गणितीय स्थिर है। यह बस Math.cos को बार-बार 1.0 से शुरू करता है जब तक परिणाम 0.7390851332151607 का नतीजा न मिलने तक परिणाम नहीं बदलता है।

मेरे दिमाग में, हम तुलना नहीं कर सकते कि दो फ़्लोटिंग-पॉइंट नंबर बराबर हैं, इसलिए मुझे लगता है कि if (x == y) का परिणाम हमेशा झूठा है, है ना?

private fun findFixPoint(): Double { 
    var x = 1.0 
    while (true) { 
     val y = Math.cos(x) 
     if (x == y) return y 
     x = y 
    } 
} 
+0

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

+0

कुछ भाषाओं में, जैसे कि फोरट्रान, फ़्लोटिंग-पॉइंट नंबर सटीक नहीं है, इसलिए यदि (x == y) वापसी वाई होना चाहिए (एबीएस (एक्स-वाई) <0.0000000001) वापसी y – HelloCW

उत्तर

3

आगे मेरी टिप्पणी पर विस्तार करने के लिए और अधिक सटीक हो रही, प्रलेखन आप कुंजी देता है।

Math.cos(double)

गणना परिणाम सटीक परिणाम के 1 ULP भीतर होना चाहिए। परिणाम अर्ध-मोनोटोनिक होना चाहिए।

एक एएनपी एन्कोडेड फ्लोटिंग पॉइंट नंबर और अगले नंबर को डेटा प्रकार में एन्कोड किया जा सकता है, इस मामले में, डबल में अंतर है।

यदि परिणाम 1 उल के भीतर होना चाहिए, तो इसका मतलब है कि परिणाम, दो फ़्लोटिंग पॉइंट मानों में से एक हो सकता है।

यह इस प्रकार है कि गणना का एकमात्र तरीका यह नहीं है कि यदि इनमें से किसी एक संख्या का इनपुट आपको अन्य नंबर देगा। लेकिन चूंकि यह कार्य अर्ध-मोनोटोनिक है जिसका अर्थ है कि ऐसा नहीं हो सकता है। अन्यथा आपके पास आउटपुट के रूप में कम मूल्य प्रदान करने वाले इनपुट के रूप में दोनों का उच्च मूल्य होगा, और कम मूल्य आपको आउटपुट के रूप में उच्चतम प्रदान करेगा। सेमी-मोनोटोनिक का मतलब है कि यह केवल एक दिशा में जाता है (इसे बहुत सरल और कुछ हद तक गलत तरीके से रखने के लिए)।

1

मेरे दिमाग में, हम तुलना नहीं कर सकते कि दो फ़्लोटिंग-पॉइंट नंबर बराबर हैं, इसलिए मुझे लगता है कि अगर परिणाम (x == y) हमेशा झूठा है, है ना?

नहीं, यह गलत है। आप तुलना कर सकते हैं कि दो फ़्लोटिंग-पॉइंट नंबर बराबर हैं लेकिन यह अधिकतर व्यर्थ है। क्योंकि परिभाषा द्वारा फ़्लोटिंग पॉइंट सटीक नहीं है। यहां तक ​​कि दो अलग-अलग गणनाओं में भी गणित में एक ही परिणाम होता है, यह गोल करने की त्रुटि के कारण प्रोग्राम में समान नहीं है। यह अभी भी बराबर होने का मौका हो सकता है।

+0

धन्यवाद! मुझे लगता है कि 100 बार मैन्युअल रूप से गणना करने के बाद Math.cos (x) 0.7390851332151607 होगा, ऊपर दिया गया कोड x == yy तक 500 गुणा की गणना करेगा, और जब उपरोक्त कोड फिर से चलाया जाए, तो शायद x = = हाँ, है ना? – HelloCW

+0

@HelloCW नहीं, कोई गारंटी नहीं है कि वे बराबर हैं, यहां तक ​​कि गणितीय बराबर हैं। – Joshua

+0

धन्यवाद! यदि हां, तो आपको क्यों लगता था कि नमूना कोड सही है? मुझे लगता है कि यह होना चाहिए (एबीएस (एक्स-वाई) <0.0000000001) वापस वाई, नमूना कोड अनंत लूप होगा – HelloCW

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