浮點運算的誤差_Assembly 浮點運算
阿新 • • 發佈:2021-01-17
技術標籤:浮點運算的誤差
電子計算機裡的浮點運算和持續精確的數學運算是不同的。數學中,所有的數都可以精確表示。但就如前面的章節所示,在電子計算機裡,許多數不能用有限個位元位來描述。所有的計算都在一定的精度下執行。在這節的例子中,為了簡單化,將使用8位的有效數。加法
要將兩個浮點數相加,它們的指數必須是相等的。如果它們並不相等,那麼通過移動較小指數的數的有效數來使它們相等。例如:考慮10.375 +6.34375 = 16.71875或在十進位制中: 這兩個數字的指數不一樣,所以通過移動有效數使指數相同,然後再相加: 注意,移位丟掉了 中的末尾的1,經過四捨五入後得 。加法的結果,減法
減法和加法一樣運作,而且有和加法一樣的問題。作為一個例子,考慮16.75 - 15.9375 = 0.8125: 移位1.1111111 X 2³後得到(四捨五入) 1.0000000 X乘法和除法
對於乘法,有效數執行乘法操作而指數執行相加操作。考慮10.375 X 2.5 = 25.9375: 當然,真正的結果需四捨五入成8位,得: 1.1010000 X = 11010.0002 = 26 除法更復雜,但是也有同樣的四捨五入的誤差問題。分支程式設計
這一節的重點是浮點運算的結果並不準確。程式設計師必須意識到這點。一個程式設計師經常犯的浮點運算錯誤就是在假定一個運算是精確的情況下,用它們去比較。例如,考慮一個執行復雜運算的f(x)函式和一個求這個函式的根的程式。你可能會試圖用下面的語句來檢查x是不是一個根: if ( f (x) == 0.0 ) 但是,如果f (x)返回1Xif ( fabs( f (x)) < EPS )
其中的EPS是一個巨集,定義為一個非常小的正數(比如說
)。當f (x)非常接近0時,它就為真。一般來說,一個浮點數(譬如x)和另一個浮點數(y)的比較,需使用:
if ( fabs(x ¡ y)/fabs(y) < EPS )