c - Float point numbers are not equal, despite being the same? -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 4 जवाब
नीचे कार्यक्रम यह नंबर समान नहीं है
। ऐसा क्यों होता है जब दोनों नंबर समान होते हैं?
शून्य मुख्य () {float f = 2.7; यदि (च == 2.7) {printf ("यह नंबर समान है"); } अन्य {printf ("यह नंबर समान नहीं है"); }}
कंपाइलर को 2.7
को नजदीकी प्रस्तुतीकरण में कनवर्ट करता है डबल
या के बारे में 2,700000000000000177635683940025046467781067 डबल
के विशिष्ट प्रतिनिधित्व दिया।
मूल्य एक नाव
करने के लिए सौंपा है, यह हो जाता है निकटतम प्रदर्शनीय नाव
या के बारे में 2.7000000476837158203125।
2,700000000000000177635683940025046467781067 बराबर नहीं 2.7000000476837158203125। एक नाव / डबल
एक संकलक का उपयोग करना चाहिए जो 2.7
बिल्कुल का प्रतिनिधित्व करता है, कोड ओपी उम्मीद के रूप में काम करेगा। एक अंतर्निहित दशमलव स्वरूप का उपयोग करके डबल
प्रतिनिधित्व दुर्लभ है। अभी तक अधिकतर अंतर्निहित डबल
प्रतिनिधित्व आधार 2 है और इन रूपान्तरण कलाकृतियों को प्रोग्रामिंग के दौरान माना जाना चाहिए।
कोड फ्लोट f = 2.5
था
>, फ्लोट
और डबल
मान, द्विआधारी या दशमलव अंतर्निहित स्वरूप का उपयोग करके, if (f == 2.5)
true बना सकता था। एक उच्च परिशुद्धता डबल
के रूप में एक ही मूल्य प्रदर्शनीय वास्तव में एक कम परिशुद्धता के रूप में नाव
।
(यह मानते हुए binary32 / binary64 फ्लोटिंग पॉइंट)
डबल
में महज 53 बिट्स का महत्व है और float
24 है। कुंजी यह है कि अगर double
के रूप में नंबर है कम से कम महत्वपूर्ण (53-24) बिट्स को 0 पर सेट किया जाता है, जब इसे float
में बदल दिया जाता है, तो उसका एक ही नंबर वाला मान float
या डबल
के रूप में होगा । जैसे 1
, 2.5
और 2.7000000476837158203125
को पूरा करें। (रेंज, उप-सामान्य और एनएएन मुद्दों को यहां अनदेखा किया गया।)
यह एक कारण है कि सटीक फ़्लोटिंग प्वाइंट की तुलना आम तौर पर केवल चुनिंदा स्थितियों में की जाती है।
Comments
Post a Comment