2012-12-01 26 views
0

我想出我的機器上的double類型對應於this維基百科文章,而long double對應於此文本:x86 Extended Precision Format打印長雙變量的所有十進制數字

這就是爲什麼floor(52/log2(10))double的15位數應該是正確的,floor(63/log2(10))long double的19位數是可信的。

代碼:

int main() 
{ 
    double d=0.1; 
    long double ld=0.1; 

    std::cout.precision(19); 
    std::cout.setf(std::ios_base::scientific); 

    std::cout << d << std::endl; 
    std::cout << ld << std::endl; 

    return 0; 
} 

給出了輸出:

1.0000000000000000555e-01 
1.0000000000000000555e-01 

如果我們設置cout.precision至16,輸出將是:

1.0000000000000001e-01 
1.0000000000000001e-01 

這還好吧,那17位double第一次輸出,第十六位double第二次輸出是不正確的。但爲什麼它不正確的long double?有沒有辦法獲得long double變量的全部19個正確數字?

如果我嘗試printf("%.19Le\n",ld);長雙,我得到完全相同的結果。

我使用OpenSUSE 12.1和g ++ 4.6.2。

回答

2

0.1字面常量不是長整倍數,它大概是雙倍。

您可能希望與

long double ld = (long double) 1.0/(long double) 10.0; 

初始化ld因此,該司包括兩個長雙操作數,所以希望在長雙做(我不知道的是,你必須仔細檢查相應的C++標準)。

而且你可能想用GCC編譯支持最新的標準。對於GCC 4.7,我建議使用g++ -Wall -std=c++11進行編譯,但是對於您的4.6版,您可能需要說-std=c++0x

+2

這是一個雙精度型。花車的末尾有'f',長'L'的兩倍(當然,情況並不重要)。 – chris

+0

謝謝,糾正。 –

+0

謝謝! '(long double)1.0 /(long double)10.0'沒有任何'-std'選項。 '長雙ld = 0.1L;'也行。 – Sergey