2 回答

TA貢獻1868條經驗 獲得超4個贊
首先,我不明白,為什么你認為sin(math.pi/2)應該接近0.999999999943741051?實際上,它必須正好是 1。
其次,您的算法中最突出的問題是,在某些時候a變得如此之小,以至于添加它不會b改變任何事情。如果此時打破循環,您將不會有這些超大的 值c,如下所示:
def sin_taylor(x, tol=1e-7, nmax=100):
b=0
for i in range (nmax):
e = float(2*i+1)
c=float(math.factorial(e))
#print(i, c, b)
a=((((-1)**i))*(x**(e))/c)
b0 = b
b += a
if b0 == b:
break
return b

TA貢獻1810條經驗 獲得超5個贊
嘗試將數字轉換為十進制,例如:
import math
import decimal
def sin_taylor(x, tol=1e-7, nmax=100):
decimal.getcontext().prec = 90
b=0
for i in range (nmax):
e = (2*i+1)
c=(math.factorial(e))
a = (-1)**i*decimal.Decimal(x)**(e)/c
b0 = b
b += a
if b0 == b:
print(i)
break
return b
print(sin_taylor(math.pi/2))
print(math.isclose(sin_taylor(math.pi/2), 1))
添加回答
舉報