java规范中的浮点表示法表示法

时间:2015-01-09 17:30:48

标签: java

此处: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^NeEmin = -(2^(K-1)-2)之间的整数,包括Emax = 2^(K-1)-1N是取决于值集的参数。

并且有一张表格:

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变量中的最大值。所以,我再次误读了这种表示法。那应该怎么读?

1 个答案:

答案 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