我有一点问题,看看:
>>> import math
>>> math.sin(math.pi)
1.2246467991473532e-16
这不是我在微积分课程中学到的东西(实际上是0)
所以,现在,我的问题:
我需要用Python执行一些重三角计算。我可以用什么库来获取正确的值?
我可以使用十进制吗?
编辑:
对不起,我的意思是另一回事。
我想要的是一些方法:
>>> awesome_lib.sin(180)
0
或者这个:
>>> awesome_lib.sin(Decimal("180"))
0
我需要一个执行良好三角学演算的图书馆。每个人都知道180°的罪是0,我需要一个能够做到这一点的库。
答案 0 :(得分:15)
1.2246467991473532e-16
接近0 - 小数点和第一个有效数字之间有16个零 - 就像3.1415926535897931
(math.pi
的值)接近pi一样。答案是正确的十六位小数!
因此,如果您希望sin(pi)
等于0,只需将其舍入到合理的小数位数即可。 15对我来说看起来不错,对于任何应用程序都应该是充足的:
print round(math.sin(math.pi), 15)
答案 1 :(得分:11)
Pi是irrational number因此无法使用有限数量的位精确表示。但是,您可以使用某些库进行符号计算,例如sympy。
>>> sympy.sin(sympy.pi)
0
关于你问题的第二部分,如果你想使用度数而不是弧度,你可以定义一个简单的转换函数
def radians(x):
return x * sympy.pi / 180
并按如下方式使用:
>>> sympy.sin(radians(180))
0
答案 2 :(得分:5)
如果您发现结果出乎意料,我敢建议您查看此文本: What Every Computer Scientist Should Know About Floating-Point Arithmetic
这真的很值得。
答案 3 :(得分:0)
你也可以试试gmpy或者真正的
在gmpy中,您可以明确指定精度:
gmpy.pi(256)
在real.py中你可以使用pa()函数:
from real import pa,pi
pa(pi)
答案 4 :(得分:0)
简答 - Decimal.cos()和Decimal.sin()都可以通过Decimal.exp()实现实现,方法是将所有偶数项分成cos()函数,将所有奇项分成sin()函数,并交替各符号这两个系列中的正负两个术语。循环中不需要更改,只根据配置的精度计算N个术语(Decimal.getcontext()。prec)。
长答案 - Python decimal.Decimal支持exp()函数,它只接受一个实数参数(与R语言中的exp()不同),并且只根据配置的精度(decimal.Decimal.getcontext()计算无限级数。 PREC)。
目前,偶数项计算cosh(),奇数项计算sinh()。它们的总和作为exp()的结果返回。如果在每个系列中修改每个术语的符号以在正负之间交替,则偶数项系列将计算cos(),奇数项系列将计算sin()。
此外,与R语言一样,此更改可以使Decimal.exp()支持复杂参数,因此exp(1j * x)可以返回Decimal.cos(x)+ 1j * Decimal.sin(x)。 / p>