float和double的范围到底是多少

Java中float占4个字节,32bit。计算范围公式为 ((-1)^S)* (2^(E-127))*(1.M) ,其中S占一位是符号位,E所占8bit是指数位,M占23位是尾数位。

这里一开始(1.M)部分一开始我一直没想明白为什么前面是1,突然有一天脑子开窍了,科学计数法表示的时候小数点前面就必须是1,所以规格化的时候小数点前面是1。

E占8位,所以大小是0-255,但是为了表示小数,指数部分需要可以是小数,对半一分,所以最后是E-127,也就是说指数部分为-127-128。

尾数部分没什么好说的,范围就是1-1.11……(23位全是1)

注意 :尾数这里1.1111实际上是  十进制的1 + 二进制的0.1111, 什么意思呢, 举例说明会清楚一点:

1.1 ----> 1+1/2 = 1.5 =  2-1/2

1.11 -----> 1+1/2 +1/4 = 1.75 = 2-1/4

总结一下上面的,按道理最大值应该是(2^128)*(2-2^(-23))=2^129-2^105=6.81*10^38,但是一般书上说的都是3.40*10^38,那么问题又来了,为什么会大了2倍?

排除掉所有出书的人抄来抄去的行为导致所有的书都错了这个因素,那么剩下的只能是上面某个地方出了问题。首先,回到上面那个我加粗的规格化上去(我个人觉得完全可以用一般情况来代替这个词),仔细想想,假如所有的数都是上面那种规格化表示的时候

第一,得到的数永远是(1.M)乘以一个数,指数部分是不会为0的,那么0怎么表示?

第二,无穷大和无穷小,还有NAN(not a number)又是怎么用这32bit表示出来的?我曾经想过的一个解释是,计算机里没有那个数就表示NAN嘛。。。以前还真觉得这个好有道理来着。但是计算机这个东西你只能当做一个工具,也就是说它不能无中生有,它只能处理我们给它的东西,所有无穷大无穷小还有NAN在计算机里肯定有一种表示方式。

所以,一定还有非规格化的表示,也就是所谓的特殊情况。

第一,当E是8个0的时候,此时就不是(1.M)而是(0.M)了,这个时候就可以表示出0了,当然还可以表示那些非常接近0的数。

第二,当E是8个1的时候,如果小数域全是0,表示的是无穷,其余的表示NAN。

由上可知,指数部分为(0-127)和(255-127)的时候表示的是两种特殊情况,所以E的范围应该是【-126,127】。最后,得出的结论是规格化的浮点数的表示范围是 正负(2^127)*(2-2^(-23))=2^128-2^104=3.40*10^38

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值