浮點數的范圍與精度


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語言中的數據成分-浮點型-李戈

https://www.icourse163.org/learn/PKU-1002529002?tid=1450221458#/learn/content?type=detail&id=1229624056&cid=1246839110

二進制后面的小數點怎么算?

https://zhidao.baidu.com/question/59125997.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM