第11章 編寫精確代碼所需編碼準(zhǔn)則

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é)果晤斩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焕檬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子澳泵,更是在濱河造成了極大的恐慌实愚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔辅,死亡現(xiàn)場離奇詭異腊敲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)幢妄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門兔仰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蕉鸳,你說我怎么就攤上這事乎赴。” “怎么了潮尝?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵榕吼,是天一觀的道長。 經(jīng)常有香客問我勉失,道長羹蚣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任乱凿,我火速辦了婚禮顽素,結(jié)果婚禮上咽弦,老公的妹妹穿的比我還像新娘。我一直安慰自己胁出,他們只是感情好型型,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著全蝶,像睡著了一般闹蒜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抑淫,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天绷落,我揣著相機(jī)與錄音,去河邊找鬼始苇。 笑死砌烁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的埂蕊。 我是一名探鬼主播往弓,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蓄氧!你這毒婦竟也來了函似?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤喉童,失蹤者是張志新(化名)和其女友劉穎撇寞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堂氯,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蔑担,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咽白。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啤握。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晶框,靈堂內(nèi)的尸體忽然破棺而出排抬,到底是詐尸還是另有隱情,我是刑警寧澤授段,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布蹲蒲,位于F島的核電站,受9級特大地震影響侵贵,放射性物質(zhì)發(fā)生泄漏届搁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卡睦。 院中可真熱鬧宴胧,春花似錦、人聲如沸么翰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浩嫌。三九已至,卻和暖如春补胚,著一層夾襖步出監(jiān)牢的瞬間码耐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工溶其, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留骚腥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓瓶逃,卻偏偏與公主長得像束铭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厢绝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容