2008-11-05 66 views
19

我做2^1000和正在此:如何避免大數量的科學記數法?

1.07151e + 301

有沒有辦法真正變成一個適當數量的這種無E + 301或至少誰能告訴我在哪裏我可以看到如何把這個爲實數,通過某種方式與E + 301的部分工作

感謝

+0

也許這是從這裏來的? http://projecteuler.net/index.php?section=problems&id=16 – 2008-11-05 14:26:02

+1

在二進制很簡單 - 一個接着1000零1。創建一個簡單的算法來進行長分區,然後對其進行排序(重複除以1010並累加餘數)。 – Skizz 2008-11-05 14:37:13

+0

它是一個合適的數字。 – 2018-03-05 11:09:01

回答

9

所以,我在想,你真正想要的只是打印出來沒有科學記數法的能力。如果您使用printf,你想要的是:

printf("%f1000.0", value); 
// note that 1000 is way larger than need be, 
// I'm just too lazy to count the digits 

隨着cout,你可以試試:

cout.setf(ios::fixed); 
cout << setprecision(0) << value; 

如果你想打印爲兩(2^1000 VS 10715電源...),你自己。

10

你需要使用專門爲長的數字設計了許多類。

要將2^1000表示爲一個確切的數字,那麼根據定義,您需要一個實際上保存1001個二進制位的數字格式。最長的普通原始整數格式通常只有64位。

順便說一句,得到的答覆是:

% perl -Mbigint -e 'print 2**1000' 
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 
+0

固定糾正差一錯誤 – Alnitak 2008-11-05 14:44:24

+1

如果你嘗試採取從Mbigint perl的,幻影會打敗你,並給它回給他們。搶侏儒部落並不好。除非你是印第安納瓊斯。 – 2008-11-05 14:45:45

0

你得到的精確數字作爲變量的類型可以支持。這個數字大約是1,然後是301個零。爲了得到一個精確的數字,你必須使用一個支持大數字的庫,或者使用爲這種數學(楓,matlab等)編寫的語言來工作

13

對於可以直接在機器寄存器中操作的數量很大。如果使用雙精度浮點數,總共有64位,其中一些用於尾數,一些用於指數,1用於符號位。

2^1000需要一個1001比特的整數來表示而不會失去精度。爲了處理這樣的數字,您需要使用支持大數字的庫,例如GNU MP

2

cout < < fixed < < your_number;

但它不會顯示整個數字。正如有人之前所說,你需要寫一個班級。

4

如果你想用C++自己做,你可以例如創建一個數字數組並自己做計算。測試和驗證,例如:

unsigned int result[400]; // result digits 
unsigned int i, j, carry; 

// Initialize result digits 
for (i = 0; i < 399; i++) { 
    result[i] = 0; 
} 
result[399] = 2; 

for (i = 2; i <= 1000; i++) { // Calculate 2^i 
    carry = 0; 
    for (j = 399; j > 0; j--) { 
    result[j] <<= 1; // multiply with 2 
    result[j] += carry; // add carry 
    carry = result[j]/10; 
    result[j] %= 10; // we want one digit (0-9) only 
    } 
} 

printf("2^1000 = "); 
// print result digits 
for (i = 0; i < 400; i++) { 
    if (result[i] != 0) { // no leading zeros, please 
    for (j = i; j < 400; j++) { 
     printf("%d", result[j]); 
    } 
    break; 
    } 
} 
printf("\n"); 
2

一種選擇,如果你的應用程序邏輯將允許它要改變單位你操縱....

如果正在測量從紐約的距離巴黎埃,選擇英里或公里來代替。 ...除了純粹的數學要求(比如說說密碼學的素數,或者......對雷曼假說的研究),很少有任何需要保留這麼多數字的準確性。

在另一方面,如果你正在做的事情,需要完全準確的整數值與許多數字,那麼你或許應該得到設計來處理大量的專業軟件......這樣的軟件絕對是可用的,雖然我不熟悉那個領域。 (成本,供應商的能力等) 如果成本是一個問題,你在想自己去寫,我不知道有足夠的瞭解什麼是參與在知道這種做法是值得的......

-1

包含頭limits.hcmath.h

cout.precision(0); 
cout<< fixed<< pow(2,31);    //OR ANY NUMBER HERE 

使用cout.precision設置精度。