python - 各种角度的精确正弦/余弦/正切

标签 python math

<分区>

有没有办法获得角度(以弧度为单位)的精确正切/余弦/正弦?

math.tan()/math.sin()/math.cos() 没有给出某些角度的精确值:

>>> from math import *
>>> from decimal import Decimal
>>> sin(pi) # should be 0
1.2246467991473532e-16
>>> sin(2*pi) # should be 0
-2.4492935982947064e-16
>>> cos(pi/2) # should be 0
6.123233995736766e-17
>>> cos(3*pi/2) # 0
-1.8369701987210297e-16
>>> tan(pi/2) # invalid; tan(pi/2) is undefined
1.633123935319537e+16
>>> tan(3*pi/2) # also undefined
5443746451065123.0
>>> tan(2*pi) # 0
-2.4492935982947064e-16
>>> tan(pi) # 0
-1.2246467991473532e-16

我尝试使用 Decimal(),但这也无济于事:

>>> tan(Decimal(pi)*2)
-2.4492935982947064e-16

numpy.sin(x) 和其他三角函数也有同样的问题。

或者,我总是可以创建一个带有值字典的新函数,例如:

def new_sin(x):
    sin_values = {math.pi: 0, 2*math.pi: 0}
    return sin_values[x] if x in sin_values.keys() else math.sin(x)

但是,这似乎是一种廉价的绕过它的方法。还有别的办法吗?谢谢!

最佳答案

不可能在计算机中存储 pi 的准确数值。 math.pi 是最接近 pi 的近似值,可以存储在 Python float 中。 math.sin(math.pi) 返回近似输入的正确结果。

为避免这种情况,您需要使用支持符号算术的库。例如,使用 sympy:

>>> from sympy import *
>>> sin(pi)
0
>>> pi
pi
>>> 

sympy 将对代表 pi 的对象进行操作,并可以给出准确的结果。

关于python - 各种角度的精确正弦/余弦/正切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15980819/

相关文章:

java - 不同高度尺寸的射线铸件

c# - 函数插值 C#

algorithm - 符号微分算法

python - 如何与路由器通信

python - 如何在多个级别的用户之间平均共享资源

python - Django:如何在其自身内部调用相同的模型类?

python - 如何通过遍历 __init__ 参数来创建实例属性?

java - 避免算术溢出

python - 返回给定字符串语言的最佳方法

c++ - 他们如何将 IR-Lock 像素转换到镜头前 1 米的法平面上的位置