日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我是架构师-基本类型-float

發布時間:2025/3/21 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我是架构师-基本类型-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.

1823 位長
SExpFraction
3130至23

偏正值 (實際的指數大小+127)

22至0位編號(從右邊開始為0)

見圖:

?

4.

單精度浮點數各種極值情況:

類別正負號實際指數有偏移指數指數域尾數域數值
0-12700000 0000000 0000 0000 0000 0000 00000.0
負零1-12700000 0000000 0000 0000 0000 0000 0000-0.0
1001270111 1111000 0000 0000 0000 0000 00001.0
-1101270111 1111000 0000 0000 0000 0000 0000-1.0
最小的非規約數*-12600000 0000000 0000 0000 0000 0000 0001±2?23 × 2?126 = ±2?149 ≈ ±1.4×10-45
中間大小的非規約數*-12600000 0000100 0000 0000 0000 0000 0000±2?1 × 2?126 = ±2?127 ≈ ±5.88×10-39
最大的非規約數*-12600000 0000111 1111 1111 1111 1111 1111±(1?2?23) × 2?126 ≈ ±1.18×10-38
最小的規約數*-12610000 0001000 0000 0000 0000 0000 0000±2?126 ≈ ±1.18×10-38
最大的規約數*1272541111 1110111 1111 1111 1111 1111 1111±(2?2?23) × 2127 ≈ ±3.4×1038
正無窮01282551111 1111000 0000 0000 0000 0000 0000+∞
負無窮11282551111 1111000 0000 0000 0000 0000 0000-∞
NaN*1282551111 1111non zeroNaN
* 符號位可以為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 30

30位,說明第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:
?

System.out.println(new Float(1/0.0f).isInfinite());System.out.println(Float.isInfinite(Float.NEGATIVE_INFINITY));System.out.println(iob1.isInfinite());System.out.println(Float.isInfinite(iob1));

?

method:hashCode()
調用 floatToIntBits(value);?

method:compareTo()
比較value 調用了compare?

method:compare(float f1,float f2)? static
見example:

float iob1 = 9;// 需要加f強轉嗎?System.out.println(Float.compare(-9, iob1)); System.out.println(Float.compare(Float.NaN, iob1)); System.out.println(Float.compare(-(1.0f/0.0f), iob1));

?method:toString
調用了valueof?

method:toString(float f) static
用了getChars,new String(...)

?
依然做個小結:
1.? float 用起來簡單,感謝jvm以及其所有開發人員
2.? float 用起來要慎重,他并非如int那樣安全
舉個例子:

float basicf = 0.95f; for(int i =100;i<=120;i++) {float f = i/100.0fSystem.out.println("f = "f+"----"+(f+basicf)); }


3.? Float有了正無窮大,負無窮大的概念
4.? float那些表現方式,以及jvm會在任何可能的地方將浮點變成double.

?

轉載于:https://blog.51cto.com/yjplxq/821567

總結

以上是生活随笔為你收集整理的我是架构师-基本类型-float的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。