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

  • 本文关键字:表示 范中 Java 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-1m是小于2^N的正整数,e是介于Emin = -(2^(K-1)-2)Emax = 2^(K-1)-1之间的整数,包括NK是依赖于值集的参数。

下面有一张表:

Parameter   float   
N              24   
K              8    

因此,假设N = 24K = 8那么我们可以从公式中获得以下值: s · 2^N · 2^(2^(K-1)-1 - N + 1)根据表中指定的值给出我们: s * 2^24 * 2^(127 - 24)等于s * 2^127。但是浮点数只有 32 位,所以不可能在其中存储这么大的数字。

因此,很明显,初始公式应该以不同的方式阅读。那怎么办?同样在javadoc中用于浮点最大值:http://docs.oracle.com/javase/7/docs/api/java/lang/Float.html#MAX_VALUE

它说:

保持浮点型最大正有限值的常量,(2-2^-23)·2^127

这也没有意义,因为结果值远大于 2^32 - 这可能是可以存储在浮点变量中的最大值。所以再一次,我误读了这个符号。那么应该如何阅读呢?

点表示法的想法是存储比整数表示可以存储在相同空间(字节)中的更大的数字范围。因此,例如,您说"结果值远大于 2^32"。但是,只有当我们在典型的数学课中存储一个典型的二进制数时,这才是一个问题。

相反,浮点表示将这 32 个字节分解为两个主要部分:- 意义-指数

为简单起见,假设 3 个字节用于有效数,1 个字节用于指数。还假设其中每个都是典型的二进制整数表示形式。因此,这三个字节的值可以是 2^24,如果要为符号保留一个位,则可以具有 2^23。但是,另一个字节最多可以存储 2^7(如果您也想要一个符号)。

因此,您可以通过将 500 存储在三个字节中

,将 100 存储在 1 字节中来表示 500^100。

从本质上讲,人们无法精确地存储每个数字。一个将其更改为有效形式,并且可以存储与为有效位数保留的部分(本例中为 3 个字节)一样多的有效数字。

与其试图解释复杂性,不如查看这篇维基百科文章了解更多信息。

最新更新