標籤:

double 和 long double 有哪些區別?

longdouble能完全替代double嗎?


1. 數據類型不是越大越好,長的數據類型有可能在一些平台上會沒有原生操作,導致速度很慢,而且內存佔用也需要考慮

2. 就目前所知,mingw在win上的std::hypot函數關於long double類型存在bug,見c++ - -O1/2/3 with -std=c++1y/11/98 ,在優化打開的情況下無法通過編譯


相信很多人學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 thelongdouble 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位)


個人買個大巴車當代步工具好嗎?

所以只要你不嫌佔地方大運算速度還慢,用範圍較大的類型無所謂=_=


精度更高......

做類redis的incrbyfloat命令得時候一開始沒有注意,一直使用double. 1+1.1 和redis結果不一樣.一看才知道人家用了long double. 換long double就好多了.

現在server基本都是64bit. 需要計算得地方最好還是用long double.


贊數據類型不是越大越好。

有一年我去參加一個類ACM的比賽,語言是C++,熱身賽上有一題,那個是個很簡單的題目,但是我卡了將近一小時,我百思不得其解,後來我把所有的in換成short,於是過了。。。但是題目的內容我已經不記得了。


推薦閱讀:

C++ 11會帶來什麼影響?
如何遍歷 std::tuple?
目前是否有C++提案是關於在編譯期獲取類/結構體成員變數的?
如今C++在非底層環境下還有多少地位?
為什麼非指針對象不能使用const成員函數?

TAG:C | C標準 |