1 浮點數在內存中分配的空間大小
在LeetCode的編譯環境下:
float:4字節(32位)
double:8字節(64位)
2 浮點數的精度
測試1:
#include <stdio.h>
int main(void) { float a = 1.23456789123456789123; double b = 1.23456789123456789123; printf("a = %.20f\n",a); printf("b = %.20f\n",b); }
輸出結果如下:
a = 1.23456788063049320 b = 1.23456789123456790 Press any key to continue
測試2:
#include <stdio.h>
int main(void) { float a = 1223456.789123456789123; double b = 1223456.789123456789123; printf("a = %.20f\n",a); printf("b = %.20f\n",b); }
輸出結果如下:
a = 1223456.75000000000000000000 b = 1223456.78912345670000000000 Press any key to continue
測試3:
#include <stdio.h>
int main(void) { float a = 3.14159265358979323846264338327950288419716939937510; double b = 3.14159265358979323846264338327950288419716939937510; printf("a = %.20f\n",a); printf("b = %.20f\n",b); }
輸出結果如下:
a = 3.14159274101257320000 b = 3.14159265358979310000 Press any key to continue
測試4:
#include <stdio.h>
int main(void) { float a = 1.111111111111111111111111111; double b = 1.111111111111111111111111111; printf("a = %.20f\n",a); printf("b = %.20f\n",b); }
輸出結果如下:
a = 1.11111116409301760000 b = 1.11111111111111120000 Press any key to continue
測試5:
#include <stdio.h>
int main(void) { float a = 12345678912; double b = 12345678912; printf("a = %.20f\n",a); printf("b = %.20f\n",b); }
測試結果如下:
a = 12345678848.00000000000000000000 b = 12345678912.00000000000000000000 Press any key to continue
從上述測試結果看,浮點數表示一個數是有很大誤差的,但double型比float型精度高。
3 浮點數的表示
以float為例,浮點數的表示如下圖所示。
-314.16在內存中的存儲方式如下圖所示:
小數位:用23位二進制表示3.1416
二進制表示十進制小數的方法:
比如0.65換算成二進制就是:
0.65 × 2 = 1.3 取1,留下0.3繼續乘二取整
0.3 × 2 = 0.6 取0, 留下0.6繼續乘二取整
0.6 × 2 = 1.2 取1,留下0.2繼續乘二取整
0.2 × 2 = 0.4 取0, 留下0.4繼續乘二取整
0.4 × 2 = 0.8 取0, 留下0.8繼續乘二取整
0.8 × 2 = 1.6 取1, 留下0.6繼續乘二取整
0.6 × 2 = 1.2 取1,留下0.2繼續乘二取整
.......
一直循環,直到達到精度限制才停止(所以,計算機保存的小數一般會有誤差,所以在編程中,要想比較兩個小數是否相等,只能比較某個精度范圍內是否相等。)。這時,十進制的0.65,用二進制就可以表示為:0.1010011。
存儲方式決定了浮點數的精度與范圍:
4 參考
計算概論與程序設計基礎-C語言中的數據成分-浮點型-李戈
二進制后面的小數點怎么算?