美文网首页
long double可不一定精度比double高♂哟

long double可不一定精度比double高♂哟

作者: YongHao | 来源:发表于2016-03-17 13:39 被阅读2047次

相信很多人学C语言时, 对long double的印象就是, 它能存储精度比double更高的浮点数.
但事实上并不完全是这样.
C98的标准是: double类型的值是long double的子集

C++ 98 standard:
and the type long double provides at least as much precision as double. The set of values of the type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double.
也就是說,long double只是定義為至少跟double一樣精度(即是可以一樣)

在wiki上的long double上找到:

On the x86 architecture, most C compilers implement long double
as the 80-bit extended precision type supported by x86 hardware (sometimes stored as 12 or 16 bytes to maintain data structure alignment), as specified in the C99 / C11 standards (IEC 60559 floating-point arithmetic (Annex F)).

An exception is Microsoft Visual C++ for x86, which makes long double
a synonym for double
.

在MSDN上, 可以发现:

Previous 16-bit versions of Microsoft C/C++ and Microsoft Visual C++ supported the long double, 80-bit precision data type. In Win32 programming, however, the long double data type maps to the double, 64-bit precision data type. The Microsoft run-time library provides long double versions of the math functions only for backward compatibility. The long double function prototypes are identical to the prototypes for their double counterparts, except that the long double data type replaces the double data type. The long doubleversions of these functions should not be used in new code.

早期windows 16位是支持long double类型(80位), 可是在Win32编程中, double跟long double等价了, 都是64位了. 尽管数学函数如sin, cos等仍然保留long double类型,可是这些仅仅用来保持向后兼容(windows为了向后兼容付出了很多的..还有dll地狱一说)
也就是说, 在32位中, long double 跟 double等价, 精度也是一样的.

我在自己机器上测试,

cout << "sizeof(double) = " << sizeof(double) << endl;
cout << "sizeof(long double) = " << sizeof(long double) << endl;

输出都是8字节(64位)

這是contribute to Wine 時遇到的問題,将嘗試解答的email整理补充而来。感謝Hong Qian一直以來的熱情幫助~

相关文章

网友评论

      本文标题:long double可不一定精度比double高♂哟

      本文链接:https://www.haomeiwen.com/subject/evrclttx.html