Во-первых, я не могу понять, почему вы считаете, что 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