Python:具有三角函数的小数

san*_*lto 5 python math floating-point trigonometry decimal

我有一点问题,看看:

>>> import math
>>> math.sin(math.pi)
1.2246467991473532e-16
Run Code Online (Sandbox Code Playgroud)

这不是我在微积分课上学到的东西(实际上是0)

所以,现在,我的问题:

我需要用Python执行一些重三角计算.我可以用什么库来获取正确的值?

我可以使用十进制吗?

编辑:

对不起,我的意思是其他的事情.

我想要的是一些方法:

>>> awesome_lib.sin(180)
0
Run Code Online (Sandbox Code Playgroud)

或这个:

>>> awesome_lib.sin(Decimal("180"))
0
Run Code Online (Sandbox Code Playgroud)

我需要一个执行良好三角学演算的图书馆.每个人都知道180°的罪是0,我需要一个能够做到这一点的库.

kin*_*all 15

1.2246467991473532e-16接近0 - 小数点和第一个有效数字之间有16个零 - 很多3.1415926535897931(值math.pi)接近pi.答案是正确的十六位小数!

因此,如果您想要sin(pi)等于0,只需将其舍入到合理的小数位数即可.15对我来说看起来不错,应该适用于任何应用程序:

print round(math.sin(math.pi), 15)
Run Code Online (Sandbox Code Playgroud)


vit*_*aut 11

Pi是一个无理数,因此无法使用有限数量的位精确表示.但是,您可以使用某些库进行符号计算,例如sympy.

>>> sympy.sin(sympy.pi)
0
Run Code Online (Sandbox Code Playgroud)

关于你问题的第二部分,如果你想使用度而不是弧度,你可以定义一个简单的转换函数

def radians(x):
    return x * sympy.pi / 180
Run Code Online (Sandbox Code Playgroud)

并按如下方式使用:

>>> sympy.sin(radians(180))
0
Run Code Online (Sandbox Code Playgroud)


ev-*_*-br 6

如果你发现结果出乎意料,我敢建议你看一下这篇文章: 每个计算机科学家应该知道的关于浮点运算的内容

这真的很值得.