float,double在記憶體中的儲存方式

2021-07-04 18:34:34 字數 1348 閱讀 3378

將17.625換算成 float型。

首先,將17.625換算成二進位制位:10001.101 ( 0.625 = 0.5+0.125, 0.5即 1/2, 0.125即 1/8 如果不會將小數部分轉換成二進位制,請參考其他書籍。) 再將 10001.101 向右移,直到小數點前只剩一位 成了 1.0001101 x 2的4次方(因為右移了4位)。此時 我們的底數m和指數e就出來了:

底數部分m,因為小數點前必為1,所以ieee規定只記錄小數點後的就好,所以此處底數為 0001101 。

指數部分e,實際為4,但須加上127,固為131,即二進位制數 10000011

符號部分s,由於是正數,所以s為0.

在float中,符號位佔1-bit,指數部分佔8-bit,底數部分佔23-bit。

綜上所述,17.625的 float 儲存格式就是:

0 10000011 00011010000000000000000

轉換成16進製制:0x41 8d 00 00

根據指數字的值,被編碼的值可以分為三種不同的情況,即,規格化值、非規格化值、特殊數值。當指數部分不全為 0 且不全為 1 時,屬於規格化值;當指數字全為 0 時,屬於非規格化值;當指數字全為 1 時,屬於特殊數值。

非規格化值有兩個目的。首先提供了一種表示數值 0 的方法。當小數字也全為 0 時,可以根據符號位的不同表示 +0.0 和 -0.0 。另外乙個功能是用來表示那些非常接近 0.0 的數,使用逐漸下溢位( gradual underflow )的方法實現這個屬性。當指數字全為1時,則被編碼的值為特殊數值,而小數字全為 0 時,可以表示正無窮大和負無窮大。當小數字為非零時,結果值被稱為 nan 。

因為表示方法限制了浮點數的範圍和精度,所以浮點運算只能近似地表示實數運算。系統需要使用「最接近」匹配值的值儲存浮點值,這就是捨入( rounding )運算的任務。 ieee 規定了四種捨入方式,預設的方式是向偶數捨入,也叫向最接近的值捨入。

const

float epsinon = 0.000001;

if ((x >= - epsinon) && (x <= epsinon))/*判斷浮點數x是否為0*/

浮點型變數並不精確,其中epsinon是允許的誤差(即精度),所以不可將float變數用「==」或「!=」與數字比較,應該設法轉化成「>=」或「<=」形式,在允許的某個範圍內認為兩個浮點數相等。

float的指數字有8位,而double的指數字有11位,分布如下:

在float中,指數部分須加上127,而在double中,指數部分須加上1023

float,double資料型別在記憶體中的儲存方式

float在記憶體中用四個byte表示 符號位 sign 指數字 exponent 尾數 mantissa 1 bit 8 bits 23 bits 符號位 1正0負 指數字 範圍從0 255,但實際的指數等於這裡的指數減去127,所以真正的指數範圍從 127 128。尾數 23bit的尾數實際上表...

在記憶體中讀寫資料

from io import stringio 建立 io.stringio記憶體緩衝器物件f f stringio 往f中寫入字串資料,並返回字串的長度 f.write hello 結果 5 f.write 結果 1 f.write world 結果 6 提取物件f中的全部內容 f.getvalu...

C語言float double的記憶體表示

在記憶體中,小數是以指數形式存在的。float double 在記憶體中的形式如下所示 小數在被儲存到記憶體前,首先轉換為下面的形式 a 2 n 其中 a 為尾數,是二進位制形式,且 1 a 2 n 為指數,是十進位制形式。例如對於 19.625,整數部分的二進位制形式為 19 1 24 0 23 ...