2013-07-06 4 views
5

अगर मैं अपने शेडर कार्यक्रम में एक अलग नाव है:glsl में अलग-अलग फ्लोट समानता परीक्षण विफल क्यों होता है?

varying highp float someFloat; 

और शिखर शेडर में, मैं यह कुछ करने के लिए निर्धारित किया है।

someFloat = 1.0; 

क्यों मेरे टुकड़े के शेडर में यह तुलना झूठी वापसी की प्रतीत होती है?

someFloat == 1.0 // false 

लेकिन यह सच है?

someFloat > .0 // true 

आईपैड मिनी में ओपनजीएल ईएस पर परीक्षण।

उत्तर

11

यह किसी भी आईईईई 754 फ्लोटिंग पॉइंट नंबर पर होता है। यह फ्लोटिंग पॉइंट प्रस्तुति की प्रकृति के कारण है। आईईईई 754 प्रारूप का उपयोग करने वाली कोई भी भाषा एक ही समस्या का सामना करेगी।

1.01.000000000... के रूप में फ़्लोटिंग पॉइंट सिस्टम में बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है, इसलिए == का उपयोग करके उनकी तुलना करना खतरनाक माना जाता है। फ़्लोटिंग पॉइंट नंबरों की हमेशा एक ईपीएसलॉन मान के साथ तुलना की जानी चाहिए।

चूंकि फ्लोटिंग पॉइंट गणनाओं में अनिश्चितता शामिल है, इसलिए हम यह देखने के लिए अनुमति दे सकते हैं कि दो नंबर एक दूसरे के करीब 'करीबी' हैं या नहीं। यदि आप तय - त्रुटि विश्लेषण, परीक्षण, या एक जंगली अनुमान के आधार पर - कि परिणाम हमेशा अपेक्षित परिणाम की 0.00001 के भीतर होना चाहिए तो आप इस के लिए अपनी तुलना बदल सकते हैं:

if (fabs(someFloat - 1.0)) < 0.00001) 

अधिकतम त्रुटि मान आम तौर पर है ईपीएसलॉन कहा जाता है।

शायद आपको What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

धन्यवाद पढ़ना चाहिए! अब मैं खुश हूं कि मैंने पूछा। –

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