相信很多人學(xué)C語(yǔ)言時(shí), 對(duì)long double的印象就是, 它能存儲(chǔ)精度比double更高的浮點(diǎn)數(shù).
但事實(shí)上并不完全是這樣.
C98的標(biāo)準(zhǔn)是: 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.
也就是說(shuō),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上, 可以發(fā)現(xiàn):
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等價(jià)了, 都是64位了. 盡管數(shù)學(xué)函數(shù)如sin, cos等仍然保留long double類型,可是這些僅僅用來(lái)保持向后兼容(windows為了向后兼容付出了很多的..還有dll地獄一說(shuō))
也就是說(shuō), 在32位中, long double 跟 double等價(jià), 精度也是一樣的.
我在自己機(jī)器上測(cè)試,
cout << "sizeof(double) = " << sizeof(double) << endl;
cout << "sizeof(long double) = " << sizeof(long double) << endl;
輸出都是8字節(jié)(64位)
這是contribute to Wine 時(shí)遇到的問(wèn)題,將嘗試解答的email整理補(bǔ)充而來(lái)质涛。感謝Hong Qian一直以來(lái)的熱情幫助~