撰寫精確代碼所需編碼準則
- 一、計算機并不如想象的精確
- 二、需要進行精確計算時避開浮點數運算
- 三、double型比float型更適合精確計算
- 四、確認整數型大小
- 五、必須明確計算單位
- 六、盡量避免資料型別轉換
- 七、留意可能出現的非線性計算結果
- 八、小結
一、計算機并不如想象的精確
- 從根本上講,計算機是用電位差進行計算操作的機器,高電位為1,低電位為0,運算時只需要0和1.所有數字機器都遵循這個原理,
- 二進制能表示十進制的0.1,0.1,0.3,0.4,0.6嗎? 不能!
二、需要進行精確計算時避開浮點數運算
- 浮點數的特性決定它無法進行精確計算,也就是說,它一直存在誤差,
- c語言中的float只能保證小數點后6位小數的精確度
- 而double只能保證15位
- 假如計算1/3+1/3,計算機給的答案是0.666667(float型)
- 但其實是2/3
- 因此我們需要精確計算時,應該用整數而非浮點數,
三、double型比float型更適合精確計算
- double型運算和float運算的速度幾乎相差無幾
- 既然速度差異不明顯,那么考慮到精確度,我們應該使用double型運算
四、確認整數型大小
- 在pc作業系統中,32位系統中int型大小為4位元組
- 16位系統中整型大小為2位元組
- 64位作業系統中int型大小為8位元組
- 當然它們各自表示的范圍也不同
- 因此我們應該養成在編碼前確認資料型別大小的好習慣,最好在變數旁標注資料型別大小
int number = 7000; //int型大小為4位元組
五、必須明確計算單位
- 程式中的變數要是有實際意義,你要給出它的單位嘛,不然誰看到懂
sum = sum +(num / 1000); //num以元為單位,sum以千元為單位
total = total + (sum / 1000); //sum以千元為單位,total以百萬元為單位
六、盡量避免資料型別轉換
- 長位元組轉換為短位元組時,精度會丟失
- 防止出現隱式轉換的方法是,在變數名前添加可表示資料型別的前綴,如下:
double dpi = 3.14159;
long int liNum;
long int liRad;
......
liNUm = dpi * liRad * liRad;
- 宣告并使用這些變數后,可以第一時間發現可能存在的不同資料型別變數之間進行的乘法或賦值運算
七、留意可能出現的非線性計算結果
- 蝴蝶效應,同樣適用于計算機運算
- 計算機并不是像我們想象中的樣子
- 浮點數反復運算后,可能已經偏離我們的預期了,這些數值偏差進而導致沉船、墜機、發電站爆炸等,,,
- 因此,如果在編碼、設計程式演算法、設計系統框架的程序中需要對細微數值差別進行反復計算,請大家無比多次校驗運算結果!!!!
八、小結
這篇細節還是比較多的,多是從變數方面展開的,大致瀏覽一下,其實還不錯哦,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/233885.html
標籤:其他
