java Double指数部取值和Double取值问题

别叫我风哥 2016-07-02 11:01:48
Double的指数部占11位,即可以表示2^11个数(2048个),考虑到补码,范围 应该是-1023~1024或-1024~1023,为啥源码中的范围是-1022~1023,
另外,尾数部为52位,小数点前的1自动补全,所以最大值为1.9999999*2^1023即2^1024,这我能理解,
但为啥取正数最小值时,尾部就变成了2^-52,小数点前的1怎么忽略了变成0了,求告知,谢谢


Double源码为

public static final int MAX_EXPONENT = 1023;
public static final int MIN_EXPONENT = -1022;

...全文
168 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
scmod 2016-07-03
  • 打赏
  • 举报
回复
楼主可以搜下IEEE 754 https://zh.wikipedia.org/wiki/IEEE_754 抄下来一段: S为符号位,Exp为指数字,Fraction为有效数字。指数部分即使用所谓的偏正值形式表示,偏正值为实际的指数大小与一个固定值(64位的情况是1023)的和。采用这种方式表示的目的是简化比较。因为,指数的值可能为正也可能为负,如果采用补码表示的话,全体符号位S和Exp自身的符号位将导致不能简单的进行大小比较。正因为如此,指数部分通常采用一个无符号的正数值存储。双精度的指数部分是−1022~+1023加上1023,指数值的大小从1~2046(0(2进位全为0)和2047(2进位全为1)是特殊值)。浮点小数计算时,指数值减去偏正值将是实际的指数大小。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧