計算科學中你不可不知道的事

在前面幾個單元,我們已經學會了Python基本型態的用法、資料結構、迴圈、邏輯判斷以及函數的建立。而現在,我們要回過頭來補充Python中floating的幾個重要觀念與限制,讓大家更了解Python中的計算科學。

(一)Python中的科學記號

一般來說,我們會把1500000寫成 [math]1.5*10^6[/math] ,而在Python中,則會表示成1.5e6或1.5e+6唷!

(二)Floating的有效範圍

讓我們來看看,Python中floating的有效範圍是多少呢?

這個範圍,大約介於正負$10^308$次方之間,所以如果超過這個大小,Python就會回傳inf唷!(代表無限大的意思)

讓我們來看些大數字的運算!

(三) NaN與None的差異

在Python中,NaN跟None是有差異的唷!
NaN代表的是無效數值(not a number)。
None代表的是缺值(missing number)。
兩者是完全不一樣的事情唷!

首先,讓我們來看看NaN!

讓我們問問Python,NaN跟None一樣嗎?

(四)有限小數表示法的精確度

我們的計算中,採用的都是10進位,單位元有0-9共計10個數字。而電腦科學的計算中,採用的是2進位,因此僅有0,1兩個單位元。這樣的差異有什麼關係呢?且讓我們看看下面這個例子。


是的,你沒看錯。很簡單的加法,我們可以很快算出0.1+0.2=0.3,然而,在Python中,因為電腦科學計算中採用的是2進位,導致不是每一個數字都可以完美的表達出來,但也盡力讓儲存結果非常相近了,但我們仍須把這樣結果的差異記在心裡。

(五) Catastrophic Cancellation

這個部分是計算科學中相當重要的一部分,在寫程式中很容易被我們忽略,請各位一定要謹記在心!

現在假設有兩個實數,x與y,y=x+e.
x是一個很大的數,而e是一個非常小的數值。

現在,我們要計算y-x,理論上我們知道y-x=(x+e)-x=e,然而,當我們在Python中輸入這個計算時,猜猜會得到多少?答案是0。到這裡,你可能會想,因為e是一個很小的數字,所以忽略也沒有關係啊!

然而,從另外一個誤差的角度切入,讓我們來看看這樣的相對誤差等於多少?

相對誤差=(e-0)/e=1=100%!!

是的,你沒有看錯,相對誤差就是100%這麼大,所以我們稱之為catastrophic cancellation!

為了避免這樣的事情發生,我們在寫程式時,可以透過數學式子的運算,更改演算法,以避免這樣的情形而達到相同的效果!因為這些誤差是累積而來的,會積少成多,造成最後結果的嚴重誤差!

相信今天的單元可能為大家帶來了些許的震撼,除了會使用程式以外,這些計算科學中運算的小細節更是我們需要注意的,避免這些錯誤的發生,才能正確運用Python達成我們想要的結果!

最後,附上上個單元小作業的解答。

現在,您已經學會基礎的Python語法以及架構了。下一系列的單元,我們將開始介紹非常實用的Numpy模組唷!

Share

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *