2017-07-18 22 views
0

所以我寫了一個簡單的腳本來演示幾何級數收斂。Math.pow vs **作爲Python中的十進制轉換?

from decimal import * 
import math 
initial = int(input("a1? ")) 
r = Decimal(input("r? ")) 
runtime = int(input("iterations? ")) 

sum_value=0 
for i in range(runtime): 
    sum_value+=Decimal(initial * math.pow(r,i)) 
    print(sum_value) 

當我使用的值,例如:

a1 = 1 
r = .2 
iterations = 100000 

我得到的融合是1.250000000000000021179302083

當我更換行:

sum_value+=Decimal(initial * math.pow(r,i)) 

有了:

sum_value+=Decimal(initial * r ** i) 

我得到一個更精確的值,1.250000000000000000000000002

究竟是這裏的區別?根據我的理解,它與math.pow是浮點操作有關,但我認爲**是數學冪函數的語法糖。如果他們確實是不同的,那麼爲什麼爲200的精度值,當輸入以下爲IDLE:

>>> Decimal(.8**500) 
Decimal('3.50746621104350087215129555150772856244326043764431058846880005304485310211166734705824986213804838358790165633656170035364028902957755917668691836297512054443359375E-49') 
>>> Decimal(math.pow(.8,500)) 
Decimal('3.50746621104350087215129555150772856244326043764431058846880005304485310211166734705824986213804838358790165633656170035364028902957755917668691836297512054443359375E-49') 

他們似乎是完全一樣的。這裏發生了什麼?

+0

使用'Decimal'進行比較無效;兩個結果在轉換之前都以「float」形式計算。 –

+0

@ IgnacioVazquez-Abrams好的謝謝 - 所以如果我切換它,以便它們不是十進制鑄造的(我只是爲了得到一個任意的精度值),爲什麼會出現這種情況? – rb612

+0

我無法重現您的結果。如果我使用相同的a1,r和迭代值運行循環,則無論我在循環中執行「r ** i」還是「math.path(r,i)」,都會得到相同的結果。你能否展示一個獨立的例子,其中產生了兩個不同的結果? – BrenBarn

回答

1

不同的是,正如你所暗示的,即math.pow()轉換輸入float S作爲在the documentation說:「不同的是內置的**運營商,math.pow()將它的兩個參數爲float類型」

因此math.pow()還提供了一個作爲float答案,獨立的輸入是否是Decimal(或int)或任何。當使用不完全可表示的號碼作爲float(但是號碼爲Decimal)時,使用**運算符可能會得到更準確的答案。

這解釋了爲什麼在使用**的情況下,由於使用Decimal數字提升爲整數,您的循環會給出更準確的結果。在第二種情況下,您無意中使用float進行兩次計算,然後在操作已執行時將結果轉換爲Decimal。如果你不是用明確的Decimal值工作,你會看到其中的差別:

>>> Decimal('.8')**500 
Decimal('3.507466211043403874762758796E-49') 
>>> Decimal(math.pow(Decimal('.8'), 500)) 
Decimal('3.50746621104350087215129555150772856244326043764431058846880005304485310211166734705824986213804838358790165633656170035364028902957755917668691836297512054443359375E-49') 

因此,在第二種情況下,Decimal值自動澆鑄爲float,結果是一樣的你上面的例子。然而,在第一種情況下,計算在Decimal域中執行併產生稍微不同的結果。