win32程式浮點資料精度問題

2021-06-17 23:13:10 字數 924 閱讀 3752

浮點數顯示問題

問題描述:在本地系統中定義了乙個float變數,並賦乙個很大值,但程式執行結果與原始值不一致。如下測試程式:

int main(int argc, char* argv)

程式執行後輸出結果為:123456790528.0

分析了浮點數在記憶體中的表示方式後發現是float的精度問題。

32位浮點數的二進位制表示方式為:r = s * m*2e-127

e為實際的指數加上固定值127。

符號位—1bit

階碼e—8bit

尾數m—23bit1

1111 1111

111 1111 1111 1111 1111 1111

數值123456789012

轉換為二進位制為:1110010111110100110010001101000010100 共37位,那麼小數點左移36位後為

1. 110010111110100110010001101000010100,由於32位浮點數尾數為23位,那麼只能保留小數點後前23位,即:1.11001011111010011001000,後面12位數根據大小進行四捨五入,比如這裡的1101000010100轉換後為6676大於213-1

,那麼向前進1,最終儲存表示為:1.11001011111010011001001

,階碼為36+127=163。

也就是經過轉換後精度有丟失,轉換後的資料為:1.110010111110100110010010000000000000,去掉小數點後,即為計算機儲存的資料大小,值為123456790528。

結論:如果使用float定義,當資料大於16777215(24個二進位制的1,111111111111111111111111)後,就會出現精度問題,與原始資料的差距範圍取決於該資料的二進位制表示中總位數與24的差值,比如這裡是37,那麼範圍為0-237-24

浮點數精度問題

一 例子 首先我們去編譯器試試 double a 1.9 通過新增監視檢視a的值 會發現a的值是1.8999999 二 開始今天的學習 在最開始學c 的時候並沒有對浮點數進行很深入的學習,認為浮點不就是小數嘛,首先在c 的巨集裡面有 flt max 和 flt min 的定義,float是四位元組的...

浮點數精度丟失問題

c 中的浮點數,分單精度 float 和雙精度 double float 是 system.single 的別名,介於 3.402823e38 和 3.402823e38 之間的32位數字,符合二進位制浮點演算法的 iec 60559 1989 ieee 754 標準 double 是 system...

浮點數的精度問題

float 1bit 符號位 8bits 指數字 23bits 尾數字 double 1bit 符號位 11bits 指數字 52bits 尾數字 對於二進位制的小數 1.1 1 20 1 2 1 1 1 2 1.5 1.01 1 20 0 2 1 1 2 2 1 1 4 1.25 1.0011 1...