2013-12-21 199 views
2

我需要編寫一個計算數學公式的簡單程序。 這裏唯一的問題是其中一個變量可以取值10^100。 因此,我不能用C++/C編寫這個程序(我不能使用像gmp這樣的外部庫)。 幾個小時前,我讀到Python能夠計算出這樣的值。 我的問題是:爲什麼 處理非常大的數字

print("%.10f"%(10.25**100)) 

被返回的數量"118137163510621843218803309161687290343217035128100169109374848108012122824436799009169146127891562496.0000000000"

代替 "118137163510621850716311252946961817841741635398513936935237985161753371506358048089333490072379307296.453937046171461"

+0

再說下面的答案,還有你的字符串格式代碼的問題。您特別要求小數點後10位數字。爲什麼你會期望輸出15位數字?另外,請記住,使用'%'進行打印*實際上會根據說明符轉換*值。因此,即使使用'decimal'模塊,如果使用'%.10f'打印它,Python將首先將該值轉換爲'float',並且您仍然會得到相同的結果。 –

+0

僅供參考,Python浮點數與C雙精度浮點數相同,並具有5​​3位精度(幾乎在所有平臺上)。那大約有16或17位十進制數字。這就是爲什麼你顯示的兩個結果在它們開始時的許多小數位後不同意。 –

回答

5

默認情況下,Python使用固定精度的浮點數據類型來表示小數(就像C中的double一樣)。你可以用precise rational numbers工作,雖然:

>>> from fractions import Fraction 
>>> Fraction("10.25") 
Fraction(41, 4) 
>>> x = Fraction("10.25") 
>>> x**100 
Fraction(189839102486063226543090986563273122284619337618944664609359292215966165735102377674211649585188827411673346619890309129617784863285653302296666895356073140724001, 1606938044258990275541962092341162602522202993782792835301376) 

您也可以使用decimal模塊,如果你想任意精度的小數(僅數字,是因爲有限小數支持可表示,雖然):

>>> from decimal import * 
>>> getcontext().prec = 150 
>>> Decimal("10.25")**100 
Decimal('118137163510621850716311252946961817841741635398513936935237985161753371506358048089333490072379307296.453937046171460995169093650913476028229144848989') 
+0

你可能打算顯示'decimal'模塊,而不是... – Bakuriu

+2

@Bakuriu:完全沒有。 「小數」不能代表任意的有理數。 –

+0

我已經知道了,但OP可能不需要表示任意有理數,但是具有一定精度的數字。 「decimal」是這個的正確工具。 「小數」可以是*數量級*比使用「分數」更快。唯一的限制是你必須有一些數字的已知界限(你可以在大部分時間完成)並設置正確的上下文。 – Bakuriu

2

Python能夠處理任意大的整數,但不能處理浮點值。他們可以變得相當大,但正如你注意到的,你失去了低位精度。