所以我寫了一個簡單的腳本來演示幾何級數收斂。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')
他們似乎是完全一樣的。這裏發生了什麼?
使用'Decimal'進行比較無效;兩個結果在轉換之前都以「float」形式計算。 –
@ IgnacioVazquez-Abrams好的謝謝 - 所以如果我切換它,以便它們不是十進制鑄造的(我只是爲了得到一個任意的精度值),爲什麼會出現這種情況? – rb612
我無法重現您的結果。如果我使用相同的a1,r和迭代值運行循環,則無論我在循環中執行「r ** i」還是「math.path(r,i)」,都會得到相同的結果。你能否展示一個獨立的例子,其中產生了兩個不同的結果? – BrenBarn