Actual long double precision does not agree with std::numeric_limits

情到浓时终转凉″ 提交于 2019-12-24 16:01:37

问题


Working on Mac OS X 10.6.2, Intel, with i686-apple-darwin10-g++-4.2.1, and compiling with the -arch x86_64 flag, I just noticed that while...

std::numeric_limits<long double>::max_exponent10 = 4932

...as is expected, when a long double is actually set to a value with exponent greater than 308, it becomes inf--ie in reality it only has 64bit precision instead of 80bit.

Also, sizeof() is showing long doubles to be 16 bytes, which they should be.

Finally, using <limits.h> gives the same results as <limits>.

Does anyone know where the discrepancy might be?

long double x = 1e308, y = 1e309;  
cout << std::numeric_limits<long double>::max_exponent10 << endl;  
cout << x << '\t' << y << endl;  
cout << sizeof(x) << endl;

gives

4932
1e+308 inf
16


回答1:


It's because 1e309 is a literal that gives a double. You need to use a long-double literal 1e309L.



来源:https://stackoverflow.com/questions/2565512/actual-long-double-precision-does-not-agree-with-stdnumeric-limits

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!