一起學(xué)JDK源碼 -- Float類

前面幾篇文章我們看了JAVA基本數(shù)據(jù)類型整型的包裝類,接下來我們看下浮點(diǎn)型float的包裝類Float類。

基礎(chǔ)知識:

1.IEEE 754:
IEEE 754是一個標(biāo)準(zhǔn),該標(biāo)準(zhǔn)定義了浮點(diǎn)數(shù)的格式還有一些特殊值,它規(guī)定了計(jì)算機(jī)中二進(jìn)制與十進(jìn)制浮點(diǎn)數(shù)轉(zhuǎn)換的格式及方法。規(guī)定了四種表示浮點(diǎn)數(shù)值的方法,單精確度(32位)、雙精確度(64位)、延伸單精確度(43位以上)與延伸雙精確度(79位以上)。JAVA語言支持這里的單精確度float,與雙精確度double。
2.無窮大:
JAVA中用Infinity表示正無窮大,任何有限正數(shù)除以0為正無窮大,正無窮的值為0x7f800000。用-Infinity表示負(fù)無窮大,任何有限負(fù)數(shù)除以0為負(fù)無窮的,負(fù)無窮的值為0xff800000。
3.NAN:
不是一個數(shù)(not a number ),NaN 用來表示處理計(jì)算中出現(xiàn)的錯誤情況,比如0除以0或負(fù)數(shù)平方根。

主要屬性:

public static final float POSITIVE_INFINITY = 1.0f / 0.0f;

public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

public static final float NaN = 0.0f / 0.0f;

public static final float MAX_VALUE = 0x1.fffffeP+127f;

public static final float MIN_NORMAL = 0x1.0p-126f;

public static final float MIN_VALUE = 0x0.000002P-126f;

public static final int MAX_EXPONENT = 127;

public static final int MIN_EXPONENT = -126;

POSITIVE_INFINITY 表示正無窮大,其值為0x7f800000。
NEGATIVE_INFINITY 表示負(fù)無窮大,其值為0xff800000。
NaN 表示計(jì)算出錯的情況,NaN 實(shí)際上是一個數(shù),而是一族數(shù)。
MAX_VALUE最大的浮點(diǎn)數(shù)值,其值為3.4028235E38,即2的127次方。
MIN_NORMAL 用來表示最小標(biāo)準(zhǔn)值,它定義為0x1.0p-126f,這里其實(shí)就是2的-126次方的了,值為1.17549435E-38f。
MIN_VALUE 最小的浮點(diǎn)數(shù)值,其值為1.4e-45f。
MAX_EXPONENT用來表示指數(shù)的最大值,這里定為127。
MIN_EXPONENT 用來表示指數(shù)的最小值,這里定為-126。

toString(float f):

public static String toString(float f) {
        return FloatingDecimal.toJavaFormatString(f);
}

通過FloatingDecimal類的toJavaFormatString方法轉(zhuǎn)成字符串。它處理的過程是先將浮點(diǎn)數(shù)轉(zhuǎn)成IEEE-754標(biāo)準(zhǔn)的二進(jìn)制形式,并且還要判斷是否是正負(fù)無窮大,是否是NaN。然后再按照IEEE-754標(biāo)準(zhǔn)從二進(jìn)制轉(zhuǎn)換成十進(jìn)制,最后生成浮點(diǎn)數(shù)對應(yīng)的字符串。

toHexString(float f) :

public static String toHexString(float f) {
        if (Math.abs(f) < FloatConsts.MIN_NORMAL
            &&  f != 0.0f ) {
            String s = Double.toHexString(Math.scalb((double)f,
                                                     DoubleConsts.MIN_EXPONENT-
                                                     FloatConsts.MIN_EXPONENT));
            return s.replaceFirst("p-1022$", "p-126");
        }
        else
            return Double.toHexString(f);
}

看方法名就知道是將,float轉(zhuǎn)換成16進(jìn)制表示的形式,這里先會判斷下目標(biāo)數(shù)f,如果是NaN則返回字符串"NaN",如果是正無窮大,則返回Infinity。如果是負(fù)無窮大則返回-Infinity。如果f為0,則用返回"0x0.0p0",-0則返回"-0x0.0p0"。如果f是具有標(biāo)準(zhǔn)化表示形式的float值,則使用子字符串表示有效位數(shù)和指數(shù)。有效位數(shù)用字符串"0x1."表示,后跟該有效位數(shù)小數(shù)部分的小寫十六進(jìn)制表示形式。除非所有位數(shù)都為0,否則移除十六進(jìn)制表示形式中的尾部0,在所有位數(shù)為0的情況下,可以用一個0表示,然后用"p"表示指數(shù),后跟無偏指數(shù)的十進(jìn)制字符串,該值與對指數(shù)值調(diào)用Integer.toString生成的值相同。如果f是具有subnormal表示形式的float值,則用字符"0x0."表示有效位數(shù),后跟該有效位數(shù)小數(shù)部分的十六進(jìn)制表示形式,移除十六進(jìn)制表示形式中的尾部0,然后用"p-126"表示指數(shù)。注意,在subnormal有效位數(shù)中,必須至少有一個非0位數(shù)。(網(wǎng)上摘的,我也看不大懂)

valueOf

public static Float valueOf(String s) throws NumberFormatException {
        return new Float(parseFloat(s));
}

public static Float valueOf(float f) {
        return new Float(f);
}

返回對應(yīng)浮點(diǎn)數(shù)的Float對象,可以看到在Float類中沒有像Byte或是Integer類那樣將常用的數(shù)存放到緩存池中。這里是直接創(chuàng)建對象,然后返回。

parseFloat(String s) :

public static float parseFloat(String s) throws NumberFormatException {
        return FloatingDecimal.parseFloat(s);
}

通過調(diào)用FloatingDecimal的parseFloat方法來實(shí)現(xiàn)對字符串的轉(zhuǎn)換.這里會先判斷s是否為NaN,Infinity,-Infinity等數(shù)。如果是以0x打頭則會按16進(jìn)制轉(zhuǎn)換為10進(jìn)制轉(zhuǎn)換。判斷是否包含了E字符,即是否是科學(xué)計(jì)數(shù)法,如果有則需要處理。

isNaN:

public static boolean isNaN(float v) {
        return (v != v);
}

判斷一個數(shù)是否是NaN,該方法邏輯很簡單,直接判斷一個數(shù)是否與自己相等,因?yàn)橐?guī)定一個NaN與任何值都不相等,包括它自己。這部分邏輯在JVM中會做,這里直接通過比較來判斷就可以了。

isInfinite

public static boolean isInfinite(float v) {
        return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}

判斷一個數(shù)是否為無窮數(shù),無窮大POSITIVE_INFINITY或無窮小NEGATIVE_INFINITY。

isFinite:

public static boolean isFinite(float f) {
        return Math.abs(f) <= FloatConsts.MAX_VALUE;
}

判斷一個數(shù)是否為有窮數(shù)。絕對值(Math.abs(f)是用來獲取一個數(shù)的絕對值的)小于FloatConsts.MAX_VALUE的數(shù)則為有窮數(shù),F(xiàn)loatConsts.MAX_VALUE的值為3.4028235e+38f,它其實(shí)與Float類中定義的MAX_VALUE相同。

floatToRawIntBits:

 public static native int floatToRawIntBits(float value);

floatToRawIntBits是一個本地方法,該方法主要是將一個浮點(diǎn)數(shù)轉(zhuǎn)成IEEE 754標(biāo)準(zhǔn)的二進(jìn)制形式對應(yīng)的整型數(shù)。用其它語言實(shí)現(xiàn)。

floatToIntBits:

public static int floatToIntBits(float value) {
    int result = floatToRawIntBits(value);
    if ( ((result & FloatConsts.EXP_BIT_MASK) ==
          FloatConsts.EXP_BIT_MASK) &&
         (result & FloatConsts.SIGNIF_BIT_MASK) != 0)
        result = 0x7fc00000;
    return result;
}

該方法主要先通過調(diào)用floatToRawIntBits獲取到IEEE 754標(biāo)準(zhǔn)對應(yīng)的整型數(shù),然后再分別用FloatConsts.EXP_BIT_MASK和FloatConsts.SIGNIF_BIT_MASK兩個掩碼去判斷是否為NaN,0x7fc00000對應(yīng)的即為NaN。

intBitsToFloat:

public static native float intBitsToFloat(int bits);

該方法與floatToRawIntBits方法對應(yīng),intBitsToFloat同樣是一個本地方法,該方法主要是將一個IEEE 754標(biāo)準(zhǔn)的二進(jìn)制形式對應(yīng)的整型數(shù)轉(zhuǎn)成一個浮點(diǎn)數(shù)。用其它語言實(shí)現(xiàn)。

sum:

public static float sum(float a, float b) {
        return a + b;
}

計(jì)算兩個浮點(diǎn)數(shù)的和。

max:

public static float max(float a, float b) {
        return Math.max(a, b);
}

取兩個浮點(diǎn)數(shù)中較大的一個。

min:

public static float min(float a, float b) {
        return Math.min(a, b);
}

取兩個浮點(diǎn)數(shù)中較小的一個。
查看所有目錄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,195評論 0 13
  • 在編程中我們總要進(jìn)行一些數(shù)學(xué)運(yùn)算以及數(shù)字處理,尤其是浮點(diǎn)數(shù)的運(yùn)算和處理,這篇文章主要介紹C語言下的數(shù)學(xué)庫。而其他語...
    歐陽大哥2013閱讀 5,304評論 0 12
  • 概述 Java的Float類主要的作用就是對基本類型float進(jìn)行封裝,提供了一些處理float類型的方法,比如f...
    luoyoub閱讀 636評論 1 0
  • 概述 整數(shù)和浮點(diǎn)數(shù) JavaScript 內(nèi)部,所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲存,即使整數(shù)也是如此。所以,1與1...
    許先生__閱讀 850評論 2 1
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 1,329評論 0 15