2016-10-11 219 views
1

假設有兩個數字22和7我想打印到第100位小數的答案,應該像3.1428571428571428571428571的....而試圖用如何精確打印浮點數或雙精度型變量的小數位數至100位?

cout << setprecision(100) << fixed << (22.0/7.0); 

我得到這樣的事情3.142857142857142793701541449991054832935333251953125。 ......

+4

既不'float'也不'double'有許多顯著的數字時,當轉換成十進制格式。 [具體來說,'float'具有大約7位精度的小數位數,'double'具有16位數](https:// en。wikipedia.org/wiki/Floating_point#Internal_representation) – jaggedSpire

+1

你可能想嘗試像gmp這樣的庫。 –

+0

不要混淆精度(你可以顯示多少個小數位)和準確性(有多少個小數位是正確的)。一旦你超過了第十五個重要數字,你可能會隨機附加數字。 –

回答

0

當我嘗試

int main() 
{ 
    const long double pi = 22.0/7.0; 
    std::cout << std::setprecision(std::numeric_limits<long double>::max()) << pi << '\n'; 
} 

我越來越細分泄漏。

你得到的max是:

int main() 
{ 
    const long double pi = 22.0/7.0; 
    std::cout << std::setprecision(std::numeric_limits<long double>::digits) << pi << '\n'; 
} 

輸出是: 3.142857142857142793701541449991054832935333251953125

+1

你對第一個例子有什麼期待? 'std :: numeric_limits :: max()'是可用'long double'表示的最大數字(不是有效數字的數目),並且你隱式地將它轉換爲'int',這是未定義的行爲,因爲該值無法表示作爲'int'。 'std :: numeric_limits :: digits'是可表示基數2位數的數字,不是十進制數字。您將輸出比顯着更多的數字。 – user4407569

+0

但我基本上有另一個問題。我提出質疑意見。我也會把它放在這裏。 \t 我得到SEG違規。我的問題是我們可以怎樣把整個內容放在一個流中? - – Naidu

+0

'digits10'也是錯誤的,它是可以不加改變地表示的基數爲10的數字。它低於存儲值的準確度。由於C++ 11有'max_digits10',它會給你唯一存儲任何類型值所需的有效位數。當然,指數需要另外保存,即通過科學記數法。 – user4407569

1

通常在C++中,雙(兩者的更大的)存儲在8個字節。 這意味着該數字可以包含2^8 * 8 = 2^64 byes(^ = power)。 這意味着在保持符號和浮點位置之後,該點之後的最大數字位數將最多爲〜15位數。因此您將不得不創建其他方法,然後再爲此計算加倍。 這裏是我的參考: https://www.tutorialspoint.com/cplusplus/cpp_data_types.htm

0

打印不是問題。代碼很好地打印作爲雙重

cout << setprecision(100) << fixed << (22.0/7.0); 

OP's reported result 
3.142857142857142793701541449991054832935333251953125....... 
// My expected result of the double 22.0/7.0 
3.1428571428571427937015414499910548329353332519531250000000.... 

使用double數學,一般情況下不會提供100位精度OP。這是爲什麼。

不同的解釋方法

double一個通常是64位。那最多可以給出2 的組合,完全可以代表的數字。考慮double n,d,q;並劃分n/d。即2 n,d的不同組合我們正試圖將所有這些結果放入q。很多人會得出相同的答案(22.0/11.0和14.0/7.0都是2.0)。然而,肯定會有超過2個不同的數學答案。

所以C 的答案,最好的 - 通常是最接近 - 表示的double

在這種情況下:22.0/7.0,確切地說,在這兩個組合中沒有一個是。
「最佳」是「像3.142857 142857 142793 7015414 ......」

double x = 22.0/7.0; 
// x 3.142857 142857 142793 701... 

// 22.0/7.0 
// math 3.142857 142857 142857 142857 

double next_x = nextafter(22.0/7.0, 4.0); 
//  3.142857 142857 143237 790... 
相關問題