Java十六进制浮点文字歧义

Java十六进制浮点文字歧义,java,floating-point,hex,ambiguity,Java,Floating Point,Hex,Ambiguity,在Java中,它表示以下内容: 对于十六进制浮点文字,至少需要一个数字(整数或小数部分),指数是必需的,浮点类型后缀是可选的。指数由ASCII字母p或p后跟可选带符号整数表示 据我所知,表示字母的指数必须是p或p,以解决十六进制数字e或e的歧义。为什么它会说表示类型的后缀(float vs double)是可选的,而使用它会导致字母d、d、f、f的歧义,这些字母也是十六进制数字?根据: 对于十六进制浮点数,可选的FloatTypeSuffix必须跟在必选的BinaryExponent后面 如果添

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

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

据我所知,表示字母的指数必须是p或p,以解决十六进制数字e或e的歧义。为什么它会说表示类型的后缀(float vs double)是可选的,而使用它会导致字母d、d、f、f的歧义,这些字母也是十六进制数字?

根据:

对于十六进制浮点数,可选的
FloatTypeSuffix
必须跟在必选的
BinaryExponent
后面


如果添加的
f
d
没有
二进制指数
,则它是一个十进制浮点数。

十六进制形式是为了使尾数精确。指数是一个整数,可以精确地表示为十进制,因此与字母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

在这种形式下,很容易看到预期的尾数和指数。其他形式也有可能,但它们没有那么清晰。

那么指数本身必须是十进制的,这就解决了问题?这部分让我很困惑,如果指数也是十六进制的呢?指数不能是十六进制的。它必须是a。这根本没有解决语言语法的问题。这个问题特别询问了涉及浮点型后缀的潜在歧义,而这个答案没有以任何方式提及后缀。
// 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