C C 浮點數儲存

2021-09-02 21:19:11 字數 2678 閱讀 4538

ieee浮點數標準定義了兩種基本的格式:以4個位元組表示單精度格式和8個位元組表示雙精度。

一. 儲存規則

float:

1位符號數 8位指數 23位有效數

0/1 bias:127

double:

1位符號數 11位指數 52位有效數

0/1 bias:1023 

1.1 8.25儲存分析

(8.25)10 = (1000.01)2

劃分三部分:

1. 符號位: 0                      0正數,1負數

2. 指數字: 10000010        科學記數法表示:(1000.01)2 = 1.00001*2^3,指數為:127+3=130

3. 有效位: 00001 000000000000000000    最高位1去除,不足23位則補0

組合三部分:0 10000010 00001000000000000000000

反向推導01000001000001000000000000000000對應十進位制值:

0                正數

10000010 130-127=3有效位為3

00001000000000000000000  整數部分補1為:1000      小數部分01 即1000.01

1.2 -7.75 儲存分析

1.3 8.58儲存分析

來點複雜的,求8.58單精度浮點數儲存方式:

十進位制小數轉化為二進位制,不斷乘以2,順次取整數字。

0.58*2 = 1.16 1 

0.16*2 = 0.32 0

0.32*2 = 0.64 0

0.64*2 = 1.28 1

0.28*2 = 0.56 0

0.56*2 = 1.12 1

0.12*2 = 0.24 0

0.24*2 = 0.48 0

0.48*2 = 0.96 0

0.96*2 = 1.92 1

0.92*2 = 1.84 1

0.84*2 = 1.68 1

0.68*2 = 1.36 1

0.36*2 = 0.72 0

0.72*2 = 1.44 1

0.44*2 = 0.88 0

0.88*2 = 1.76 1

0.76*2 = 1.52 1

0.52*2 = 1.04 1

0.04*2 = 0.08 0

0.08*2 = 0.16 0

0.16*2 = 0.32 0

0.32*2 = 0.64 0

0.64*2 = 1.28 1

0.28*2 = 0.54 0

0.54*2 = 1.08 1

通過上面的計算,我們發現0.58自0.16處一直迴圈,二進位制方式不能完整表示該整數,這會有什麼影響?

8.58 = 1000.10010100011110101110000...

二進位制儲存方式:

0 10000010 00010010100011110101110

測試程式:

float a = 8.58f;

char *p = (char*)&a;

p a$1 = 8.57999992

p /x *p@4

$2 =

gdb除錯發現a的值怎麼變成8.57999992,我們用上述二進位制計算其10進製看看:

0.58 = 10010100011110101110000

>>> 2**-1+2**-4+2**-6+2**-10+2**-11+2**-12+2**-13+2**-15+2**-17+2**-18+2**-19

0.57999992370605469

上述結果與gdb除錯一致,除了可以表示為2的冪次以及整數數乘的浮點數可以準確表示外,其餘的數的值都是近似值。同時float有效位才23位,導致大部分位數被截斷。

二. 大小比較

既然浮點數大多是儲存的近似值,那麼如何比較其大小?

/**

* 浮點數大小比較

*/bool isequal(float a, float b, float abserror, float relerror )

result++;

}// min

if( divisor == int_min )

return result;

///dividend = abs( dividend );

divisor = abs( divisor );

int digit = 0;

// 增大除數的倍數至與除數接近

while( divisor <= (dividend>>1) )

while( digit >= 0 )

return isneg? -result:result;

}

十進位制轉化為二進位制小數

**c/c++的浮點數在記憶體中的儲存方式

C C 中浮點數的儲存

任何資料在記憶體中都是以二進位制的形式儲存的,例如乙個short型資料1156,其二進位制表示形式為00000100 10000100。則在intel cpu架構的系統中,存放方式為 10000100 低位址單元 00000100 高位址單元 因為intel cpu的架構是小端模式。但是對於浮點數在...

浮點數 儲存

關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...

浮點數的儲存

浮點數在計算機中的儲存格式 符號位 指數字 尾數字 符號位 指數字 尾數字 float 1位 8位 23位 共32位 double 1位 11位 52位 共64位 任何浮點數都可表示為 1.m 2e 符號位 sign 表示式中的 0表示正數,1表示負數。指數字 exponent 表示式中的e,指數字...