官术网_书友最值得收藏!

1.5.2 浮點(diǎn)數(shù)在Java虛擬機(jī)中的表示

在Java虛擬機(jī)中,浮點(diǎn)數(shù)有float和double兩種,分別是32位和64位浮點(diǎn)數(shù)。浮點(diǎn)數(shù)在虛擬機(jī)中的表示比整數(shù)略顯復(fù)雜。目前,使用最為廣泛的是由IEEE 754定義的浮點(diǎn)數(shù)格式。目前Java虛擬機(jī)中對(duì)于浮點(diǎn)數(shù)的處理參考IEEE 754的規(guī)范。本節(jié)將以float為例,簡要介紹浮點(diǎn)數(shù)的表示方法。

在IEEE 754的定義中,一個(gè)浮點(diǎn)數(shù)由3部分組成,分別是符號(hào)位、指數(shù)位和尾數(shù)位。以32位float類型為例,符號(hào)位占1位,表示正負(fù)數(shù),指數(shù)位占8位,尾數(shù)位占剩余的23位,如圖1.2所示。

其中,sflag表示符號(hào),當(dāng)s為0時(shí),sflag為1,當(dāng)s為1時(shí),sflag為-1。m為尾數(shù)值,實(shí)際占用空間為23位,但是根據(jù)e的取值,有24位精度。當(dāng)e全為0時(shí),尾數(shù)位附加為0,否則,尾數(shù)位附加為1。e為指數(shù)位,用8位表示。

圖1.2 浮點(diǎn)數(shù)格式

以浮點(diǎn)數(shù)-5為例,其內(nèi)部表示為:

1 10000001 01000000000000000000000

符號(hào)位為1表示負(fù)數(shù),指數(shù)位為10000001,表示129。

尾數(shù)位為:01000000000000000000000。因?yàn)閑不全為0,故實(shí)際的尾數(shù)位為:

101000000000000000000000

尾數(shù)位表示2的指數(shù)次冪的和,每一位表示求和數(shù)列中的對(duì)應(yīng)項(xiàng)是否為0,這里表示:

1*20+0*2-1+1*2-2+0*2-3+0*2-4+0*2-5+…,對(duì)應(yīng)關(guān)系如圖1.3所示。

圖1.3 尾數(shù)的計(jì)算

故1 10000001 01000000000000000000000的值為:

-1*2(129-127)*(1*20+0*2-1+1*2-2+0*2-3+0*2-4+0*2-5)=-1*4*1.25=-5

float浮點(diǎn)數(shù)還可以表示一些特殊的數(shù)字,如表1.1所示。

表1.1 float的特殊數(shù)字

其中,指數(shù)位全為1表示無窮大和NaN等特殊數(shù)字。指數(shù)位全為0為非規(guī)范化的浮點(diǎn)數(shù)。

【示例1-2】在Java中,使用Float.floatToRawIntBits()函數(shù)可以獲得一個(gè)單精度浮點(diǎn)數(shù)的IEEE 754表示。以下代碼打印了-5的內(nèi)部表示:

程序運(yùn)行結(jié)果為:

其中,F(xiàn)loat.floatToRawIntBits()函數(shù)最終由native方法實(shí)現(xiàn),具體實(shí)現(xiàn)如下:

從上述代碼可以看出,為了獲取float的內(nèi)部表示,使用了C語言中的union自然實(shí)現(xiàn)這個(gè)轉(zhuǎn)換。

主站蜘蛛池模板: 旺苍县| 南溪县| 孝义市| 钟山县| 房产| 庆云县| 上饶县| 太仆寺旗| 保康县| 河津市| 法库县| 富蕴县| 罗山县| 天峻县| 龙江县| 石家庄市| 康保县| 宜兰市| 遂溪县| 尉氏县| 阿荣旗| 隆回县| 定襄县| 丰原市| 太康县| 泰顺县| 阿拉尔市| 南丰县| 定边县| 雷州市| 含山县| 龙山县| 将乐县| 襄汾县| 友谊县| 新沂市| 乐平市| 进贤县| 分宜县| 新蔡县| 胶州市|