NaNs और Infinites इस तरह की तुलनाओं को खराब कर सकते हैं, जैसा कि अन्य ने पहले ही उल्लेख किया है।
हालांकि, वहाँ आगे ख़तरा है: C++ आप, नाव प्रकार का एक संकलन समय अभिव्यक्ति पर भरोसा नहीं कर सकते एक ही अभिव्यक्ति रन टाइम पर मूल्यांकन किया जाता के बराबर की तुलना।
उस के लिए कारण यह है कि सी ++ fp संगणना के लिए विस्तारित परिशुद्धता की अनुमति देता है, किसी भी बिना सोचे समझे तरीके से है। उदाहरण:
एक विशेष संकलक साथ
#include <iostream>
// This provides sufficent obfuscation so that g++ doesn't just inline results.
bool obfuscatedTrue() { return true; }
int main()
{
using namespace std;
double const a = (obfuscatedTrue()? 3.0 : 0.3);
double const b = (obfuscatedTrue()? 7.0 : 0.7);
double const c = a/b;
cout << (c == a/b? "OK." : "\"Wrong\" comparision result.") << endl;
}
परिणाम:
C:\test> g++ --version | find "++"
g++ (TDM-2 mingw32) 4.4.1
C:\test> g++ fp_comparision_problem.cpp & a
"Wrong" comparision result.
C:\test> g++ -O fp_comparision_problem.cpp & a
OK.
C:\test> _
चीयर्स & hth,
- Alf
स्रोत
2010-10-12 17:08:27
यह डिबग करने के लिए प्रयास करें।। यही कारण है कि काम करने वाला नहीं है: – rkellerm
@ rursw1 अधिक मानक – CsTamas
से एक गारंटी @ rursw1 वहाँ अगर दिलचस्पी। –