11.1 計算機(jī)并不如想象得那么精確
數(shù)字電路機(jī)器無法準(zhǔn)確表示小數(shù)。
11.2 需要進(jìn)行精確計算時避開浮點數(shù)運算
浮點數(shù)的特性決定其無法進(jìn)行精確計算。
C語言的float型數(shù)據(jù)只能保證小數(shù)點之后6位小數(shù)的精確度,而double型只能保證15位化漆。浮點數(shù)運算一直存在這種誤差付材,因此,需要精確計算式睬隶,應(yīng)該用整數(shù)而非浮點數(shù)泞坦。特別是進(jìn)行金融相關(guān)計算時滤蝠,例如銀行或信用卡公司蹄皱,哪怕只有1元錢的誤差压鉴,都需要通宵加班查明原因,所以更應(yīng)盡量避免使用浮點數(shù)運算婉宰。
11.3 double型比float型更適合精確計算
當(dāng)然,使用比double型更大的long double型或unsigned long double型會更好骗露。
完全沒有辦法處理圓周率這種精確度在小數(shù)點后數(shù)十位以上的數(shù)值嗎述寡?當(dāng)然不是。首先,可以用科學(xué)計算專用語言FROTRAN編寫程序。如果必須用C語言編寫,那么可以利用數(shù)組實現(xiàn)精確度更高的實數(shù)運算,之不過這種編寫過程非常復(fù)雜。
11.4 確認(rèn)整數(shù)型大小
整數(shù)型大小取決于計算機(jī)的定義耙考,不同計算機(jī)定義的整數(shù)型大小可能不同诵次。大部分UNIX系列操作系統(tǒng)定義整數(shù)型大小位4自己(32位),而PC中常用的操作系統(tǒng)有的定義整數(shù)型大小為2字節(jié)(16位),有的是4字節(jié)(32位)。大型服務(wù)器中還存在將int型定義為8字節(jié)(64位)的情況。更有甚者,將整數(shù)型數(shù)據(jù)大小定義為9位或40位缤底。因此徙歼,最好事先確認(rèn)整數(shù)型數(shù)據(jù)大小灭翔。
編譯器手冊中會記錄數(shù)據(jù)類型大小,limits.h文件中也會有相關(guān)記載井辜。還有一種確認(rèn)數(shù)據(jù)類型大小的方法是冤留,使用sizeof運算符。
總之诺祸,大家應(yīng)該養(yǎng)成編碼之前確認(rèn)數(shù)據(jù)類型大小的好習(xí)慣,最好能夠在變量旁邊標(biāo)注數(shù)據(jù)類型大小,可以提醒日后負(fù)責(zé)將該程序移植到PC端任務(wù)的程序員卸勺,使其對該變量大小多加留意。
11.5 必須明確計算單位
在注釋中表明當(dāng)前計算使用的單位
11.6 特別留意除法運算
11.7 盡量避免數(shù)據(jù)類型轉(zhuǎn)換
數(shù)據(jù)類型的轉(zhuǎn)換始終存在風(fēng)險映企。將高類型(長字節(jié))轉(zhuǎn)換位低類型(短字節(jié))時浴麻,會損失一定的數(shù)據(jù)精度软免。所以需要進(jìn)行精確計算的程序中漓骚,最好避免此類操作挟鸠,尤其需要注意是否存在隱式數(shù)據(jù)類型轉(zhuǎn)換覆享。
11.8 精通編程語言的語法
11.9 留意可能出現(xiàn)的非線性計算結(jié)果
復(fù)雜系統(tǒng)理論或“蝴蝶效應(yīng)”的內(nèi)容眾所周知,本書不再贅述淌哟。而碼農(nóng)婶希、程序員和系統(tǒng)架構(gòu)師一定要牢記,計算機(jī)反復(fù)運算的結(jié)果可能遠(yuǎn)遠(yuǎn)偏離我們的預(yù)期蓬衡。
特別是涉及浮點數(shù)的話喻杈,這種現(xiàn)象尤為突出。浮點數(shù)本身并不是一種精確的數(shù)值表示形式狰晚,如果再對齊進(jìn)行反復(fù)運算筒饰,那么結(jié)果可能和預(yù)期值相差很大。這些數(shù)值偏差可能導(dǎo)致沉船壁晒、墜機(jī)瓷们、升降機(jī)驟停、發(fā)電炸爆炸等事故秒咐,而這些事故又可能引發(fā)社會混亂谬晕、糾紛不斷、戰(zhàn)爭爆發(fā)携取,甚至導(dǎo)致人類滅亡攒钳。
因此,如果在編碼雷滋、設(shè)計程序算法不撑、設(shè)計系統(tǒng)框架的過程中需要對細(xì)微數(shù)據(jù)差別進(jìn)行反復(fù)計算,請各位務(wù)必多次校驗運算結(jié)果晤斩。