Java十六进制浮点文字歧义

时间:2018-06-25 14:55:39

标签: java floating-point hex ambiguity

在Java specification中,它表示以下内容:

  

对于十六进制浮点文字,至少需要一位数字(在整数或小数部分中),并且指数是必需的,而浮点类型后缀是可选的。指数由ASCII字母p或P表示,后跟一个可选的带符号整数。

据我了解,指示字母的指数必须为p或P才能解决与十六进制数字e或E的歧义。为什么然后说后缀指示类型(浮点数与双精度数)是可选的,使用时会用字母d,D,f,F引入歧义,它们也是十六进制数字吗?

2 个答案:

答案 0 :(得分:3)

根据grammar

DecimalFloatingPointLiteral:
  Digits . [Digits] [ExponentPart] [FloatTypeSuffix] 
  . Digits [ExponentPart] [FloatTypeSuffix] 
  Digits ExponentPart [FloatTypeSuffix] 
  Digits [ExponentPart] FloatTypeSuffix

HexadecimalFloatingPointLiteral:
  HexSignificand BinaryExponent [FloatTypeSuffix]

可选的FloatTypeSuffix 必须遵循强制性BinaryExponent以获取十六进制浮点数。

如果您添加f或不包含d的{​​{1}},则为十进制浮点数。

答案 1 :(得分:0)

十六进制形式是使尾数精确。指数是一个整数,可以精确地表示为十进制,因此与字母d或f没有冲突。

标准化浮点数的格式为

sign * 1.mantissa * 2 ^ exponent

如果您查看这些示例,则在精确指定尾数时应该使用十六进制表示法。

// from java.lang.Double

public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308

public static final double MIN_NORMAL = 0x1.0p-1022; // 2.2250738585072014E-308

public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324

以这种形式很容易看到期望的尾数和指数。虽然其他形式也是可能的,但不清楚。