int 轉 float 底層實現

2022-07-06 13:42:14 字數 1600 閱讀 9099

#include #include #include #include int main()

}printf("%x\n",(int)(float)(16777219));

printf("%d\n",(int)(float)(16777219));

float f = 16777217;

printf("%f\n",f);

}//輸出

016777217

1000001

16777216

1000004

16777220

16777216.000000

對於浮點數來說,尾數m的位數反應浮點數的有效位數,他決定了數的表示精度,有效位越多,表示精度就越高;階e的位數決定數x的表示範圍;即階e的值確定了小數點的位置。

對於float這種單精度浮點數來說,其包括1位符號位,8為階碼,23位尾數。由於隱藏位的機制,float最多可以容納24尾數的能力。但ieee754隱藏位只能是在小數點左側,故小數表示最多為23位。

對於int來說,32位補碼表示,範圍為\(\left[ -2^,2^-1 \right]\),對於intfloat來說,可能會有有效數字捨去的風險。理由如下:

一、對於int i=1 0000 0000 0000 0000 0000 0000來說,轉化為float很容易。

即\(1.000000000000000000000000\times 2^\),小數部分為23位,可以對應float的23位尾數。

二、但對於int i=1 0000 0000 0000 0000 0000 0001來說,轉化為float就會出現捨去

此時轉化為浮點數為\(1.000000000000000000000001\times 2^\),擁有24位小數,轉化為float必須捨去最後一位,造成\(i\ne \left( int \right) \left( float \right) i\),以此類推,在24位小數的情況下,最後一位小數必須為0,這樣才可以在捨去末尾數後不影響真值。再以此類推,在25位小數的情況下,最後兩位小數必須為0,才不影響真值

下面用**測試

#include #include #include #include int main()

}}//輸出,捨去的數,與理論猜測一致

16777217,16777216,1000001

16777219,16777220,1000003

16777221,16777220,1000005

16777223,16777224,1000007

16777225,16777224,1000009

16777227,16777228,100000b

16777229,16777228,100000d

16777231,16777232,100000f

實現從float到int的強轉

include include int float to int float f 指數字 intindex f new 0x7f800000 011111111.23個0 index f new 23 index index 127 130 127 3 尾數字 int temp f new 0x00...

float轉int注意事項

最近遇到乙個低階錯誤,哈哈,都不好意思講出來,會犯這種低階錯誤。寫此部落格,記錄我的低階錯誤,以防下次再犯。問題是這樣的,我有一些float型別的資料,我需要將這這些浮點型資料放大到整數,然後轉換成int型別資料,比如float a 5.1 10就得到整數51,然後將浮點型資料51賦值給乙個int型...

float和int相互轉換

利用unsigned char 指標,在任意型別之間轉換 直接強制將float強制轉換成int 最後一位丟失精度則 0.5處理 序列通訊是以位元組為單位進行傳送的,對於浮點數和整型數都需要進行轉換位元組陣列才能進行通訊。mcu和pc的浮點數都是基於ieee754格式的。有4位元組 float 8位元...