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))
添加回答
举报