Java中,基本數據float 和double的包裝類Float和Double都是浮點類型spa
因此對於浮點數在計算機中的表示方法須要有一個基本瞭解,不然很難了解清楚Float和Double的實現原理3d
本文對計算機中的浮點數表示IEEE754標準,進行了簡單介紹blog
標準規定
指數偏移值爲 2(e−1) -1 e爲指數的位數
|
單精度 指數偏移值爲127 對於雙精度 指數偏移值爲1023 |
指數無符號數表示的範圍
單精度8位 0~255
雙精度11位 0~2047
|
指數真值也就是實際的值
單精度 -127 ~ 128
雙精度 -1022 ~ 1023
|
不過頭尾 被保留, 會另作他用 ,下面會繼續說明 因此實際的值要去掉頭尾,也就是
單精度 -126 ~ 127
雙精度 -1022 ~ 1023
|
單精度指數的範圍(指數 - 指數偏移值以後的值 ) 爲: -126 ~ 127 |
正數最大值 指數爲正數的最大值 127 尾數 也爲最大值 所有都是1 也就是23個1 (-1)0 × 1.11111...(23個1) × 2127 也就是 (2−2−23)×2127 |
1.11111...(23個1) = 20 +2-1 +2-2 + ....2-23
公比 q= 1/2 a1 = 20
代入公式
|
正數最小值
指數爲負數的最小值 -126
尾數 也爲最小值, 所有都是0 也就是23個0
1.0 × 2-126
|
雙精度指數的範圍(指數 - 指數偏移值以後的值 ) 爲:
-1022 ~ 1023
|
正數最大值
指數爲正數的最大值 1023
尾數 也爲最大值 所有都是1 也就是52個1
(-1)0 * 1.11111...(52個1) * 21023
也就是
(2−2−52)×21023 (仍是等比數列求和)
|
正數最小值
指數爲負數的最小值 -1022
尾數 也爲最小值, 所有都是0 也就是52個0
1.0 × 2-1022
|
在非標準化狀況下,尾數部分以前有隱含的小數點, 可是小數點以前,隱含的不在是1 而是0 |
對於指數的真值,再也不是指數部分表示的無符號數減掉指數偏移量
一旦指數部分爲0 (也就是全部的比特位都是0),這就是一個標記符號了,再也不有指數大小的含義
這種狀況下
指數的真值爲 1 - 指數偏移量
單精度爲 1-127= -126
雙精度爲 1-1023 = -1022
|
單精度 (−1)s × (0.f) × 2-126 雙精度 (−1)s × (0.f) × 2-1022 |
單精度 | 0.0000...1(23位,最後一位爲1) × 2-126 = 2-23 × 2-126 = 2-149 |
雙精度 | 0.0000...1(52位,最後一位爲1) × 2-1022 = 2-52 × 2-1022 = 2-1074 |
當指數部分中全部bit的值全是1,f中全部bit的值全是0,表示無窮大
根據符號位來區分正無窮和負無窮
|
當指數部分中全部bit的值全是1,f中全部bit的值不全是0 表示NaN(Not a Number) |
若是 指數 是0 而且 小數部分 是0, 這個數是0 根據符號位區分+0 和 -0 |