在Java specification中,它表示以下内容:
对于十六进制浮点文字,至少需要一位数字(在整数或小数部分中),并且指数是必需的,而浮点类型后缀是可选的。指数由ASCII字母p或P表示,后跟一个可选的带符号整数。
据我了解,指示字母的指数必须为p或P才能解决与十六进制数字e或E的歧义。为什么然后说后缀指示类型(浮点数与双精度数)是可选的,使用时会用字母d,D,f,F引入歧义,它们也是十六进制数字吗?
答案 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
以这种形式很容易看到期望的尾数和指数。虽然其他形式也是可能的,但不清楚。