【深刻淺出-JVM】(3):浮點數

-5 浮點數推導

二進制轉十進制

1 10000001 01000000000000000000000jvm

1 10000001 101000000000000000000000 若是指數位不全爲 0 則尾數位首位+1 ,若是指數位全爲 0,則尾數位首位+0code

十進制 = -1 2^(129-127) (1 2^0 + 1 2^-2) = -1 4 1.25 = -5get

十進制轉二進制

5 = 101(B) = 1.01 * 2^2 指數爲 2,則指數段的值爲 2+127 = 129 = 10000001 由於不全爲 0 尾數部分首位的 1 去掉,而後右側補全 0table

1 負數二進制

1 10000001 指數段的值爲 2+127=129float

1 10000001 101 尾數段爲 101 規範化

1 10000001 01 由於不全爲 0 尾數部分首位的 1 去掉tab

1 10000001 01000000000000000000000 而後右側補全 0,尾數部分一共23 位co

十進制(整數)轉二進制(整數)

除2取餘, (直到商爲 0) ,逆序浮點數

789=1100010101(B)

394 1

197 0

98 1

49 0

24 1

12 0

6 0

3 0

1 1

0 1 (最終 商 < 1)

1100010101

推理: A = abcdef(B)

A = f 2 ^ 0 + e 2 ^ 1+ d 2 ^ 2 + c 2 ^ 3+ b 2 ^ 4 + a 2 ^ 5

A/2 = e 2 ^ 0+ d 2 ^ 1+ c 2 ^ 2 + b 2 ^ 3 + a * 2 ^ 4 除以 2 留餘數獲得 f

.... 除以 2 留餘數獲得 d

..... 除以 2 留餘數獲得 a

反過來寫就是 abcdef

十進制純小數轉換成二進制純小數

乘2 取整,直到小數部分爲 0(或者達到所要求的精度…),順序排列

0.8125 = (0.1101)(B)

1.6250 1

1.25 1

0.5 0

1.0 1

十進制小數轉換成二進制小數

整數部分與小數部分合並

(789.8125) = 1100010101.1101(B)

float 特殊值

|含義|數值|

|正無窮 | 0 11111111 00000000000000000000000 |

|負無窮 | 1 11111111 00000000000000000000000|

|NaN | 0 11111111 10000000000000000000000|

|最大浮點數 | 0 11111110 11111111111111111111111|1.11111111111111111111111 * 2^(254-127)

|最小規範化正浮點數 | 0 00000001 00000000000000000000000|1.0 * 2^1-127|

|最小正浮點數 | 0 00000000 00000000000000000000000|

|0 | 0 00000000 00000000000000000000000|

注意

  • float最大精度 小數點後 6 位
  • 浮點數 0.99 根本沒辦法用二進制表示 ,無窮多的 11111 只有 0.5 倍數的能夠被二進制科學計數法表示

感謝您的耐心閱讀,若是您發現文章中有一些沒表述清楚的,或者是不對的地方,請給我留言,您的鼓勵是做者寫做最大的動力。

做 者 : @mousycoder

原文出處 : http://mousycoder.com/thinkin...

相關文章
相關標籤/搜索