【问题标题】:P in constant declaration常量声明中的 P
【发布时间】:2011-12-22 11:27:59
【问题描述】:

java.lang.Double中,有如下常量声明:

public static final double MAX_VALUE = 0x1.fffffffffffffP+1023;
public static final double MIN_NORMAL = 0x1.0p-1022;

P 是干什么用的?大小写的区别重要吗?

我知道LDF 用于Longs、Doubles 和Floats,但之前从未见过P

【问题讨论】:

  • 可能是十六进制浮点数?
  • "p" for "power" (?) as "e" 可能被误解为十六进制符号 (?)

标签: java


【解决方案1】:

P(或p)表示十六进制的floating-point literal,其中有效数字以十六进制指定。

使用p 代替e。您看到的df 后缀与此正交:0x1.0p+2f0x1.0p+2d 都是有效的文字(一个是float 类型,另一个是double 类型)。

乍一看,0x 前缀似乎足以识别十六进制浮点文字,那么为什么 Java 设计人员选择将字母从 e 更改为 p?这与 e 是一个有效的十六进制数字有关,因此保留它会导致解析歧义。考虑:

0x1e+2

这是一个十六进制的 double 还是两个整数的和,0x1e2?当我们将e 更改为p 时,歧义就解决了:

0x1p+2

【讨论】:

    【解决方案2】:

    p 语法如果用于以十六进制定义双精度文字。这在您想要定义其精确表示时很有用,但在一般代码中没有用,因为您希望双精度值是十进制值而不是一些十六进制模式。

    【讨论】:

      【解决方案3】:

      它是一个十六进制的浮点字面量,语法是:sign*0x*significand*p*exponent。请参阅此blog 以获得解释。

      【讨论】:

        【解决方案4】:

        用于表示十六进制浮点字面量。

        浮点字面量包含以下部分:整数部分, 十进制或十六进制点(由 ASCII 句点表示 字符)、小数部分、指数和类型后缀。一种 浮点数可以写为十进制值或 十六进制值。对于十进制文字,指数(如果存在)是 由 ASCII 字母 e 或 E 表示,后跟可选带符号的 整数。 对于十六进制文字,指数始终是必需的,并且 由 ASCII 字母 p 或 P 表示,后跟可选的 有符号整数。

        来自http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#230798

        【讨论】:

          猜你喜欢
          • 2011-09-18
          • 2011-03-11
          • 1970-01-01
          • 1970-01-01
          • 2012-04-29
          • 1970-01-01
          • 2014-06-30
          • 1970-01-01
          • 2018-04-09
          相关资源
          最近更新 更多