2012-06-01 104 views
4
我有一个小问题

小数,一起来看看:的Python:用三角函数

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

这不是我在我的微积分学类(这是0,实际上)

所以,现在,我的问题:

我需要用Python执行一些沉重的三角函数微积分。我可以使用什么库来获取正确的值?

我可以使用十进制吗?

编辑:

对不起,我的意思是其他的东西。

我想一些方法来做到:

>>> awesome_lib.sin(180) 
0 

或本:

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

我需要进行良好的三角函数演算libraray。大家都知道,罪180°是0,我需要一个能够做到这一点的图书馆。

+2

“我可以使用十进制吗?”不,皮是不合理的。 –

+3

相关的问题是:你打算使用这个库的具体内容是什么?这将决定你是否真的需要符号计算,或者是否有一些重量级的方法来做你想做的事情。你真的应该阅读@ Zhenya的答案中的“每个计算机科学家应该知道什么是浮点算术”。 – comingstorm

+0

其实,你得到的答案是*正确的*,因为'math.pi'是最接近pi的浮点数,而不是pi本身!如果需要,您应该再次阅读浮点运算的链接。 – jorgeca

回答

14

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

所以,如果你想sin(pi)等于0,只需将其舍入到合理的小数位数。 15对我来说很好,应该对任何应用程序会有很多:

print round(math.sin(math.pi), 15) 
+0

我忘了谢谢你的回答。你是对的。如果PI不是“确切”的值,我怎么能等待罪(PI)是一个确切的值?对不起,我似乎太笨了。感谢您的回答! – santiagobasulto

10

Pi为一个irrational number所以它不能准确地使用有限位数字来表示。但是,您可以使用一些库进行符号计算,例如sympy

>>> sympy.sin(sympy.pi) 
0 

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

def radians(x): 
    return x * sympy.pi/180 

,并用它如下:

>>> sympy.sin(radians(180)) 
0 
+0

谢谢你。这很有用。我更新了我的问题。 – santiagobasulto

+0

这很漂亮,我不知道'sympy'可以做到这一点。 – kindall

0

你也可以尝试gmpy或实际

在gmpy你可以明确地指定精度:

gmpy.pi(256) 
实时

。PY您可以使用PA()函数:

from real import pa,pi 
    pa(pi) 
+1

使用更精确的pi值可以得到更精确的结果,但它不一定会导致*精确*的结果。 –

0

简答 - Decimal.cos()和Decimal.sin()都可以从Decimal.exp实现()通过拆分所有甚至执行条款将cos()函数和所有奇数项转换为sin()函数,并在这两个系列中将正项和负项之间的每个项的符号交替。根据配置的精度(Decimal.getcontext()。prec)仅计算N个项的循环中不需要进行更改。

长的答案 - 的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)。