天天看點

計算機科學及程式設計導論(5)浮點數和二分法

Python的數字類型分為兩類:整型(int)以及浮點型(float)。

對于Python來說,整型可以取無限大。

Python的整型可以取任意精度

例如,可以輸入2**1000次方,仍然會傳回正确結果。

Python的浮點類型按照IEE754标準,對于64位的計算機而言,表示成如下方式

1位:符号位 11位:指數位 52位:尾數位

這樣總共可以表示17位長的精度,如果超過17位,Python就無法處理,比如

0.1**1000次方.

在教學視訊中,如果輸入 x =

0.1,那麼最終列印的值則是0.10000000000000001。原因很簡單,因計算機處理數字的方式是二進制,而0.1的二進制則是0.0001100110011...,這樣轉換過程中就會出現誤差(新版的python可能對結果進行了處理再顯示,是以顯示出來仍為0.1)。比如下面程式對s進行累加,每次累加0.1

由于誤差的積累,最後一位變成了8. 

誤差的存在,使得浮點型在進行 ==

判斷的操作時,經常出現違背直覺的結果:

是以,對于浮點型來說,我們不需要去判斷結果是否相等,而是要判斷結果是否小于某個允許的誤內插補點:

abs(a*a - 2.0) < 某個極小的正數

之前已經學習過求X的平方根,不過X被假定為開平方後為整數,是以就可以從0開始進行枚舉。現在,考慮更為一般的形式,X開方後不一定為确定的數,由于在實數範圍内無法進行一一的枚舉,是以要采用其他方法來求解。

基本的解題思路是逐次逼近法,即每一次讓結果逼近正确答案一點,也就是說,采取猜想-》檢查-》改進的過程:

guess = initial guess 疊代100次:   如果  f(guess)接近正确答案:傳回guess 否則:令 guess = better guess 如果無傳回值,則報錯

 而要判斷f(guess)是否接近正确答案很簡單,隻需要進行驗證即可:abs(guess**2

-x) < 某個極小的正數

assert語句相當于将調試的斷點插入到程式中,比如,如果輸入的epsilon的值為-1,則會顯示如下錯誤:

File "/Users/ihuangmx/程式/Python/Untitled.py", line 2, in squareRootBi assert epsilon > 0,‘epsilon must be postive,not‘ + str(epsilon) AssertionError: epsilon must be postive,not-1

 上面的程式還存在Bug,下一講會進行完善。