Python:具有三角函数的小数

时间:2012-06-01 16:39:04

标签: python math floating-point decimal trigonometry

我有一点问题,看看:

>>> import math
>>> math.sin(math.pi)
1.2246467991473532e-16

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

所以,现在,我的问题:

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

我可以使用十进制吗?

编辑:

对不起,我的意思是另一回事。

我想要的是一些方法:

>>> awesome_lib.sin(180)
0

或者这个:

>>> awesome_lib.sin(Decimal("180"))
0

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

5 个答案:

答案 0 :(得分:15)

1.2246467991473532e-16接近0 - 小数点和第一个有效数字之间有16个零 - 就像3.1415926535897931math.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>