4 回答

TA貢獻1797條經驗 獲得超6個贊
請注意-1 ** n,它不會像您期望的那樣被解析。 **比一元更緊密地綁定-(具有更高的優先級),所以這個表達式被解析為-(1 ** n). 類似于藍牙解決方案,我會做類似的事情
from math import factorial, pow
from itertools import takewhile, count
large = lambda y: abs(y) > 1e-7
def sin_gen(x):
for n in count():
yield (pow(-1, n) * pow(x, (2 * n + 1))) / factorial(2 * n + 1)
def sin(x):
return sum(takewhile(large, sin_gen(x)))
print(sin(5)) # -0.9589242932128198

TA貢獻1860條經驗 獲得超8個贊
這就是我的做法,它使用公式但不直接使用。
(-1) ** n
是前一個值乘以-1
。x ** (2n + 1)
是前一個值乘以x * x
。(2n + 1)!
是前一個值乘以2n * (2n + 1)
。
這意味著您的循環不進行冪或階乘計算,這樣效率更高。這是在Python中:
def approx_sin(x, eps=1e-7):
term = x
two_n = 0
total = 0
while abs(term) >= eps:
total += term
two_n += 2
term *= -x * x / (two_n * (two_n + 1))
return total

TA貢獻1848條經驗 獲得超10個贊
鑒于這是一個無限系列,您可以創建一個生成器,給定x通過每次遞增n來提供下一個評估。
from math import factorial, pow
def sin_gen(x):
n = 0
while True:
result = (pow(-1, n) * pow(x, (2 * n + 1))) / factorial(2 * n + 1)
yield result
n += 1
現在您只需對每個評估求和,直到總數達到您想要的為止。
g = sin_gen(x)
total = 0
for val in g:
if abs(val) < 1.0e-7:
break
total += val
print(total)
添加回答
舉報