此处: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
,{{1} }是一个小于m
的正整数,2^N
是e
和Emin = -(2^(K-1)-2)
之间的整数,包括Emax = 2^(K-1)-1
和N
是取决于值集的参数。
并且有一张表格:
K
因此,让我们说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)
。但浮动只有32位,所以它不可能存储在这么大的数字。
显而易见,应该以不同的方式阅读初始公式。那么如何? 同样在javadoc中,Float最大值:http://docs.oracle.com/javase/7/docs/api/java/lang/Float.html#MAX_VALUE
它说:
保持float类型的最大正有限值的常量
s * 2^127
这也没有意义,因为结果值远大于2 ^ 32 - 这可能是存储在float变量中的最大值。所以,我再次误读了这种表示法。那应该怎么读?
答案 0 :(得分:2)
使用浮点表示法的想法是存储比使用整数表示存储在相同空间(字节)中更大的数字范围。因此,例如,您说"结果值远大于2 ^ 32"。但是,如果我们将典型的二进制数存储为典型的数学类中的计算器,那只会是一个问题。
相反,浮点表示将这32个字节分成两个主要部分: - 有意义的 - 指数
为简单起见,假设3个字节用于有效数字,1个字节用于指数。还假设这些中的每一个都是典型的二进制整数样式表示。因此,如果要为符号保留一位,则三个字节可以具有值2 ^ 24或2 ^ 23。 但是,另一个字节最多可以存储2 ^ 7(如果你想在那里也有一个符号)。
因此,您可以通过将500个存储在三个字节中并将100个存储在1个字节中来表示500 ^ 100。
基本上,人们不能精确地存储每个数字。一个将其更改为重要形式,并且可以存储与为有效数字保留的部分一样多的有效数字(在此示例中为3个字节)。
而不是试图解释并发症,check this Wikipedia article for more。