1. 程式人生 > >浮點數計算精度控制

浮點數計算精度控制

進一步除錯我發現,浮點數計算錯誤發生在一個函式(InitEngine)呼叫後,在此函式呼叫前就不會出這個問題。這個函式是一個引擎的初時化函式,無法知道他的具體實現,是什麼原因造成了浮點計算錯誤呢?

編譯選項設定不當?應該不會吧,因為生成的彙編程式碼是正確的呀。在彙編程式碼正確的情況下,浮點計算精度太小,唯一的原因只能是fpu的狀態錯誤了。我從網上搜到了intel的開發手冊,找到介紹fpu的章節發現fpu的計算精度和它的控制暫存器中的兩個bit位有關。重新除錯程式並注意觀察fpu的控制暫存器的變化,果然在呼叫函式前後fpu控制字由0x027f變為了0x007f,即fpu計算精度由雙精度變為了單精度,明白了這點就不難明白上面的問題了,也就有了解決的辦法。