2012-06-01 129 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)。