tft每日頭條

 > 生活

 > 單精度浮點數詳解

單精度浮點數詳解

生活 更新时间:2025-01-25 23:59:50

單精度浮點數詳解(浮點數比較的精度問題)1

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; }

單精度浮點數詳解(浮點數比較的精度問題)2

c != 0.3

單精度浮點數詳解(浮點數比較的精度問題)3

a,b,c局部變量值

如果變量 a , b 換 0.75 , 0.5 可以看出運行出 c == 1.25 ,說明浮點數運算是不穩定的。

單精度浮點數詳解(浮點數比較的精度問題)4

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 型轉化為内存存儲格式的步驟為:

  • 先将這個實數的絕對值化為二進制格式,注意實數的整數部分和小數部分的二進制方法在上面已經探讨過了。
  • 将這個二進制格式實數的小數點左移或右移 n 位,直到小數點移動到第一個有效數字的右邊。
  • 從小數點右邊第一位開始數出二十三位數字放入第 22 到第 0 位。
  • 如果實數是正的,則在第 31 位放入“0”,否則放入“1”。
  • 如果 是左移得到的,說明指數是正的,第 30 位放入“1”。如果 n 是右移得到的或 n=0,則第 30 位放入“0”。
  • 如果 n 是左移得到的,則将 n 減去 1 後化為二進制,并在左邊加“0”補足七位,放入第 29 到第 23 位。如果n是右移得到的或 n=0,則将 n 化為二進制後在左邊加“0”補足七位,再各位求反,再放入第 29 到第 23 位。

0.2356 的内存存儲格式:

  • 将 0.2356 化為二進制後大約是0.00111100010100000100100000。
  • 将小數點右移三位得到1.11100010100000100100000。
  • 從小數點右邊數出二十三位有效數字,即11100010100000100100000放 入第 22 到第 0 位。
  • 由于 0.2356 是正的,所以在第 31 位放入“0”。
  • 由于我們把小數點右移了,所以在第 30 位放入“0”。
  • 因為小數點被右移了 3 位,所以将 3 化為二進制,在左邊補“0”補足七位,得到0000011,各位取反,得到1111100,放入第 29 到第 23 位。
  • 最後表示0.2356為:0 0 1111100 11100010100000100100000
浮點類型标識的有效數字及數值範圍
  • Float :比特數為 32 ,有效數字為 6-7 ,數值範圍為 -3.4E 38~3.4E 38
  • Double :比特數為 64 ,有效數字為 15-16 ,數值範圍為 -1.7E-308~1.7E 308
,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved