1 引言
先舉個例子:
#include<stdio.h>
//公衆号:c語言與cpp編程
intmain()
{
floata=0.1;
floatb=0.2;
floatc=a b;
if(c==0.3){
printf("c==0.3\n");
}else{
printf("0.1 0.2!=0.3\n");
}
return0;
}
c != 0.3
a,b,c局部變量值
如果變量 a , b 換 0.75 , 0.5 可以看出運行出 c == 1.25 ,說明浮點數運算是不穩定的。
a=0.5,b=0.75,c == 1.25
為什麼會時好時壞,因為不是所有的小數能用浮點數标準 ( IEEE 754 ) 表示出來。
所以,判斷兩個浮點數變量是否相等,不能簡單地通過 "==" 運算符實現,浮點數進行比較時,一般比較他們之間的差值在一定範圍之内。
boolfeq(floata,floatb){
returnfabs(a,b)<FLT_EPSILON;
}
FLT_EPSILON 數值是 1.192092896e-07F,最小的 float 型數,它使 1.0 FLT_EPSILON !=1.0
2 為什麼浮點數精度會丢失十進制小數轉化為二進制數:乘以2直到沒有了小數為止。
舉個例子,0.9 表示成二進制數。
0.9*2=1.8取整數部分1
0.8(1.8的小數部分)*2=1.6 取整數部分 1
0.6*2=1.2取整數部分1
0.2*2=0.4取整數部分0
0.4*2=0.8取整數部分0
0.8*2=1.6取整數部分1
0.6*2=1.2取整數部分0
.........
0.9二進制表示為(從上往下):1100100100100......
很顯然,小數的二進制表示有時是不可能精确的。其實道理很簡單,十進制系統中能不能準确表示出 2/3 呢?同樣二進制系統也無法準确表示 1/10 。這也就解釋了為什麼浮點型精度丢失問題。
3 float 存儲原理float 型在内存中占 4 個字節。float 的 32 個二進制位結構如下:
float 内存存儲結構
313029----2322----0實數符号位指數符号位指數位有效數位
其中符号位 1 表示正,0 表示負。有效位數位 24 位,其中一位是實數符号位。
将一個 float 型轉化為内存存儲格式的步驟為:
0.2356 的内存存儲格式:
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!