我是架构师-基本类型-float
講述float這個類型確實讓我有點沒有頭緒,但還是簡單說下。?
關于最大值最小值問題
Float.MAX_VALUE = 0x1.fffffeP+127f;
Float.MIN_VALUE = 2-149;?
ps:(看到MAX_VALUE這樣令人發指的寫法確實有些不爽,特地寫出來就是想說明一下:
先看表達式:
?? 1. 0x代表 16進制
?? 2. 1.fffffe(不區分大小寫) 代表16進制的小數表示,轉換10進制需要 除以16
?? 3. p/P(不區分大小寫) 代表2
?? 4. +/-? 在這表代表的是指數符號? +127代表127次方,+號可以省略
?? 5. 最后一位f 代表轉成float,而不是double?
對jvm,0x0.5 顯然是不能接受的行為,但現在可以這樣 0x0.5p0f, 這會是什么呢?
不妨靈活運用這種方式。)?
?
除了MAX_VALUE 和 MIN_VALUE 以外,我們發現:
MAX_EXPONENT = 127 有限 float 變量可能具有的最大指數。
MIN_EXPONENT = -126 標準化 float 變量可能具有的最小指數。
MIN_NORMAL = 0x1.0p-126f 保存 float 類型數據的最小正標準值的常量,即 2-126。
?
這時我們來看一個概念(當然我盡可能簡單說):IEEE 754
1. IEEE二進制浮點數算術標準(IEEE 754)1980年代以來最廣泛使用的浮點數運算標準。
2. IEEE 754規定了四種表示浮點數值的方式:單精確度(32位元)、雙精確度(64位元)、延伸單精確度(43位元以上,很少使用)與延伸雙精確度(79位元以上,通常以80位元實做)。只有32位元模式有強制要求,其他都是選擇性的。(就是說我們的float)
3.
| 1 | 8 | 23 位長 |
| S | Exp | Fraction |
| 31 | 30至23 偏正值 (實際的指數大小+127) | 22至0位編號(從右邊開始為0) |
見圖:
?
4.
單精度浮點數各種極值情況:
| 零 | 0 | -127 | 0 | 0000 0000 | 000 0000 0000 0000 0000 0000 | 0.0 |
| 負零 | 1 | -127 | 0 | 0000 0000 | 000 0000 0000 0000 0000 0000 | -0.0 |
| 1 | 0 | 0 | 127 | 0111 1111 | 000 0000 0000 0000 0000 0000 | 1.0 |
| -1 | 1 | 0 | 127 | 0111 1111 | 000 0000 0000 0000 0000 0000 | -1.0 |
| 最小的非規約數 | * | -126 | 0 | 0000 0000 | 000 0000 0000 0000 0000 0001 | ±2?23 × 2?126 = ±2?149 ≈ ±1.4×10-45 |
| 中間大小的非規約數 | * | -126 | 0 | 0000 0000 | 100 0000 0000 0000 0000 0000 | ±2?1 × 2?126 = ±2?127 ≈ ±5.88×10-39 |
| 最大的非規約數 | * | -126 | 0 | 0000 0000 | 111 1111 1111 1111 1111 1111 | ±(1?2?23) × 2?126 ≈ ±1.18×10-38 |
| 最小的規約數 | * | -126 | 1 | 0000 0001 | 000 0000 0000 0000 0000 0000 | ±2?126 ≈ ±1.18×10-38 |
| 最大的規約數 | * | 127 | 254 | 1111 1110 | 111 1111 1111 1111 1111 1111 | ±(2?2?23) × 2127 ≈ ±3.4×1038 |
| 正無窮 | 0 | 128 | 255 | 1111 1111 | 000 0000 0000 0000 0000 0000 | +∞ |
| 負無窮 | 1 | 128 | 255 | 1111 1111 | 000 0000 0000 0000 0000 0000 | -∞ |
| NaN | * | 128 | 255 | 1111 1111 | non zero | NaN |
| * 符號位可以為0或1 . | ||||||
?
一下子搞出這么多東西可能會嚇到你,那我用我的表述:
float和double 與以前你看到的int的二級制不再一樣。 他把32位分成了3個段,當然根據某個標準(或者叫協議,比如IEEE754)。然后,為了應付這一切帶來的瑣碎事情,我們不得不建立更多的屬性和方法。
?
當然,對IEEE754的表述顯然并不滿意,我決定單獨寫一篇附加說明,來說明它。
?
下面,看下 int f = 1 ,(特地用int,并不推薦此行為),跟我做如下事情:
int intValue = Float.floatToIntBits(i); String binaryS = Integer.toBinaryString(intValue); System.out.println("intValue = "+intValue); System.out.println("binaryS = " + binaryS ); System.out.println(binaryS.length()); out: intValue = 1065353216 binaryS = 111111100000000000000000000000 3030位,說明第32位(即左數第一位)是0,31位是0。正如IEEE754中介紹的,第4條 value等于1時。
?
下面介紹下方法:
method: floatToIntBits(float value)
API這樣描述:
???? 根據 IEEE 754 浮點“單一格式”位布局,返回指定浮點值的表示形式。
???? 我通俗的說:得到浮點值的二進制格式(<=32位),并以int的10進制返回。如果遇到這樣的一個int值,可以通過intBitsToFloat(int)得到浮點值。
???? 此方法比floatToRawIntBits 多做一步,將 NaN 編碼為一個“規范”NaN 值的位模式。
?
method:floatToRawIntBits(float value)
根據 IEEE 754 浮點“單一格式”位布局,返回指定浮點值的表示形式,并保留非數字 (NaN) 值。?
method:isInfinite() -還有個static方法,一起說明.
如果此 Float 值的大小是無窮大,則返回 true,否則返回 false。
見example:
?
?
method:hashCode()
調用 floatToIntBits(value);?
method:compareTo()
比較value 調用了compare?
method:compare(float f1,float f2)? static
見example:
?method:toString
調用了valueof?
method:toString(float f) static
用了getChars,new String(...)
?
依然做個小結:
1.? float 用起來簡單,感謝jvm以及其所有開發人員
2.? float 用起來要慎重,他并非如int那樣安全
舉個例子:
3.? Float有了正無窮大,負無窮大的概念
4.? float那些表現方式,以及jvm會在任何可能的地方將浮點變成double.
?
轉載于:https://blog.51cto.com/yjplxq/821567
總結
以上是生活随笔為你收集整理的我是架构师-基本类型-float的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET MVC – 关于Acti
- 下一篇: 让Dreamweaver支持phtml