深入浅出JVM3浮点数

25次阅读

共计 1218 个字符,预计需要花费 4 分钟才能阅读完成。

-5 浮点数推导

二进制转十进制

1 10000001 01000000000000000000000

1 10000001 101000000000000000000000 如果指数位不全为 0 则尾数位首位 +1,如果指数位全为 0,则尾数位首位 +0

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

十进制转二进制

5 = 101(B) = 1.01 * 2^2 指数为 2,则指数段的值为 2+127 = 129 = 10000001 因为不全为 0 尾数部分首位的 1 去掉,然后右侧补全 0

1 负数

1 10000001 指数段的值为 2+127=129

1 10000001 101 尾数段为 101

1 10000001 01 因为不全为 0 尾数部分首位的 1 去掉

1 10000001 01000000000000000000000 然后右侧补全 0,尾数部分一共 23 位

十进制 (整数) 转二进制(整数)

除 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…

正文完
 0

深入浅出JVM3浮点数

25次阅读

共计 1110 个字符,预计需要花费 3 分钟才能阅读完成。

-5 浮点数推导

二进制转十进制

1 10000001 01000000000000000000000

1 10000001 101000000000000000000000 如果指数位不全为 0 则尾数位首位 +1,如果指数位全为 0,则尾数位首位 +0

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

十进制转二进制

5 = 101(B) = 1.01 * 2^2 指数为 2,则指数段的值为 2+127 = 129 = 10000001 因为不全为 0 尾数部分首位的 1 去掉,然后右侧补全 0

1 负数

1 10000001 指数段的值为 2+127=129

1 10000001 101 尾数段为 101

1 10000001 01 因为不全为 0 尾数部分首位的 1 去掉

1 10000001 01000000000000000000000 然后右侧补全 0,尾数部分一共 23 位

十进制 (整数) 转二进制(整数)

除 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 倍数的可以被二进制科学计数法表示
正文完
 0