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^105=6.81*10^38,但一般书中写的是3.40*10^38,所以问题是

如果排除了所有出书人抄录的行为把所有书都搞错的因素,剩下的只是上面的某个地方出了问题。 首先,回到上面我用粗体字表示的标准化。 我个人认为,可以用一般情况代替这个词。 仔细想想,假如所有的数都是上面那种规格化表示的时候

第一,得到的数总是(1.M )乘以数,指数部分不会变成0。 那么,0是怎么表示的呢?

第二,无限大和无限小,以及Nan(notanumber )如何用这32位表示? 我想到的一个解释是,如果计算机没有那个数量,就表示NAN。 我以前真的觉得这很有道理。 但是,电脑只能作为一个工具使用。 也就是说,不能从无中产生有。 那个只能处理我们给的东西。 无限大无限小而且NAN在计算机中一定有一种表现方法。

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

第一,e为8个0时,此时为0.M ),而不是(1.M )。 此时,可以表示0。 当然,也可以表示那些非常接近0的数。

第二,当e为8个1时,如果小数全部为0,则其表示无限,其馀表示NAN。

综上所述,指数部分为(0-127 )和(255-127 )时表示两种特殊情况,因此e的范围应该为【- 126,127】。 最后得出了归一化浮点数的显示范围为正负(2) 127 ) (2-2^ )-23 ) )2^104=3.40*10^38的结论