2015-01-03 131 views
3

我從wikipedia是雙號最多有15-17顯著十進制數字15位二進制64位小數?

然而,對於低於

double x = std::pow(10,-16); 
std::cout<<"x="<<std::setprecision(100000)<<x<<std::endl; 

(爲了測試它,使用this online shell),我得到了簡單的C++程序學

x=9.999999999999999790977867240346035618411149408467364363417573258630000054836273193359375e-17 

其中有88個重要的十進制數字,顯然與Wiki的上述聲明相矛盾。任何人都可以澄清我應該誤解的東西嗎?謝謝。

+0

這些數字中的大部分都*不*顯着;他們中的大多數無法區分這個值與下一個最大或最小可能的「雙」值。 –

+1

@大衛:我投票重新開放(沒有意識到我的投票由於我的金徽章...);我認爲這不是[標準的「爲什麼FP被破壞?」 - 類型的問題](http://stackoverflow.com/questions/588004/is-floating-point-math-broken);它是在詢問標準精確索賠和'setprecision'行爲之間的明顯差異。 –

+1

@OliverCharlesworth我相信這是一個老問題,就像往常一樣,關於可表示性 –

回答

6

沒有矛盾。如您所見,x的值在其小數點擴展中的第一個7處不正確;我在此之前計算了16位正確的數字。 std::setprecision不控制輸入到std::cout的精度,它只是顯示您請求的數量。也許std::setprecision命名不佳,應該替換爲std::displayprecision,但std::setprecision正在完成其工作。從語言學的角度來看,將std::setprecision設置爲std::cout的精度,而不是試圖將參數的精度控制爲std::cout

相關問題