我正在尝试编写模拟math.sin
和math.tan
的函数,但不是使用math
库,而是使用级数展开执行计算。你知道吗
公式来自数学SE,How would you calculate the Tangent without a calculator?:
sin(x) = x − x^3/3! + x^5/5! −...
tan(x) = sin(x) / √(1 − sin(x)^2)
这是我的尝试,但我不知道如何执行符号翻转+
/-
/+
/。。。sin
系列扩展的一部分:
from math import factorial
res = 0
for i in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]:
res += 1**i/factorial(i)
print(res) # 1.1752011936438016
结果不正确,因为我没有应用+
/-
开关。我可以添加一个if
/else
子句,但这看起来很混乱。有更好的办法吗?你知道吗
注意:这个问题是@Lana昨天发布的now deleted question的修饰版本。你知道吗
你很接近。下面是使用
sum
和enumerate
进行系列扩展的一种方法。你知道吗enumerate
的工作原理是获取iterable的每个值并附加一个索引,即0代表第一项,1代表第二项,等等。然后我们只需要测试索引是偶数还是奇数,并使用ternary statement。你知道吗此外,您可以使用
range
而不是列出扩展中所需的奇数。你知道吗您可以避免使用三元语句和
enumerate
:如果你用手写出前几个术语,等价性就会变得很清楚。你知道吗
备注:
tan
函数的符号只对第一象限和第四象限正确。这与您提供的公式一致。您可以对输入执行简单的转换来说明这一点。你知道吗n
来提高精度。你知道吗通过使用前一项计算总和的下一项,可以避免在每一步重新计算x**n和阶乘:
与jpp的版本相比,它的速度大约是jpp的两倍:
如果我们一劳永逸地计算
- x**2
,速度会更快一些:相关问题 更多 >
编程相关推荐