2010-04-02 39 views
1

使用i686-apple-darwin10-g ++ - 4.2.1在Mac OS X 10.6.2,Intel上編譯並使用-arch x86_64標誌進行編譯,我只是注意到,雖然......實際長雙精度與std :: numeric_limits不一致

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

...如預期,在很長的雙實際上是設置爲與指數超過308的值,它成爲INF - 即在現實中,它只有64位精度,而不是80bit。

此外,sizeof()顯示長雙打爲16字節,他們應該是。

最後,使用<limits.h>給出與<limits>相同的結果。

有沒有人知道差異可能在哪裏?

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

1E + 308 INF

回答

5

這是因爲1e309是文字,給出了一個雙。您需要使用長雙字形文字1e309L

+0

太棒了,謝謝。 不幸的是,在我注意到pow()函數的返回值發生這種情況後,我只是使用文字作爲測試用例,即使是非常小心的打字。 感謝上帝,它不是一個編譯器問題! – dmb 2010-04-02 07:39:03

+0

是的,可悲的是,pow((long double)2,1020)= 1.12356e + 307和pow((long double)2,1030)= inf ...任何想法? – dmb 2010-04-02 07:51:51

+2

@dmb:有'pow'的3個變種。 'pow'以'double'操作。你需要'powl'。 – kennytm 2010-04-02 07:53:50