这里:http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.2.3,它说:
任何浮点值集的有限非零值都可以用
s · m · 2^(e - N + 1)表示,其中s是+1或-1,m是小于2^N的正整数,e是Emin = -(2^(K-1)-2)和Emax = 2^(K-1)-1之间的整数,包括N和D12是依赖于值集的参数。
下面有一张表格:
Parameter float
N 24
K 8 因此,假设是N = 24和K = 8,那么我们可以从公式中得到以下值:s · 2^N · 2^(2^(K-1)-1 - N + 1),它根据表中指定的值给我们:s * 2^24 * 2^(127 - 24),它等于s * 2^127。但是float只有32位,所以不可能在其中存储这么大的数字。
因此,很明显,初始公式应该以不同的方式读取。那又如何呢?同样在javadoc中用于Float值:价值
上面写着:
保持浮点数最大正定值的常数,(2-2^-23)·2^127
这也没有意义,因为结果值要比2^32大得多--这可能是可以存储在浮存变量中的最大值。所以,我又一次误解了这个符号。那该怎么读呢?
发布于 2015-01-09 17:50:10
浮点表示法的思想是存储比用整数表示的相同空间(字节)存储的数字范围大得多。因此,例如,您说“结果值远大于2^32”。但是,只有当我们在一个典型的数学类中存储一个典型的二进制数时,这才会成为一个问题。
相反,浮点表示将这32字节分解为两个主要部分:- significand into。
为了简单起见,假设这个值使用3个字节,指数使用1个字节。另外,假设其中的每一个都是典型的二进制整数表示方式。因此,这三个字节的值可以是2^24,或者2^23,如果您想为符号保留一个位的话。但是,另一个字节最多可以存储2^7 (如果您也想要一个符号的话)。
因此,您可以表示500^ 100,方法是将500存储在三个字节中,100存储在1字节中。
本质上,一个人不可能精确地存储每一个数字。一个将其更改为显着性形式,并且可以存储与为significand保留的部分一样多的有效数字(本例中为3个字节)。
而不是试图解释并发症,请查看维基百科的这篇文章以获得更多信息。。
https://stackoverflow.com/questions/27866010
复制相似问题