【发布时间】:2016-05-21 16:50:19
【问题描述】:
例如,在 Java 中,这是一个十六进制数 0x10。
0x10.2P2 是正确的十六进制双精度数。
但是为什么0x1f.2 不正确呢?为什么我们不能使用它,而 0x1f.2P1 应该给出相同的结果但它有效?
【问题讨论】:
-
指数是强制性的
例如,在 Java 中,这是一个十六进制数 0x10。
0x10.2P2 是正确的十六进制双精度数。
但是为什么0x1f.2 不正确呢?为什么我们不能使用它,而 0x1f.2P1 应该给出相同的结果但它有效?
【问题讨论】:
好吧,如果你真的是说为什么,我们将不得不希望负责语法的人中的一位能加入。在我看来,使指数可选不会伤害解析文字的能力,但我没有详细考虑过。我所能提供的只是Java Language Specification §3.10.2 需要它:
对于十六进制浮点字面量,至少需要一位数字(整数部分或小数部分),指数是强制性的,浮点类型后缀是可选的。指数由 ASCII 字母 p 或 P 表示,后跟一个可选的有符号整数。
【讨论】:
在之前的 Stack Overflow 问题中有一些“为什么”的衡量标准:
0xp0 prints 0.0 (Hexadecimal Floating Point Literal)
这里:
@NPE 的这个“最佳答案”给出了一个理由:
乍一看,0x 前缀似乎足以 识别十六进制浮点文字,那么为什么 Java 设计者有 选择将字母从 e 更改为 p?这与 e 是一个 有效的十六进制数字,因此保留它会导致解析歧义。 考虑:
0x1e+2
这是一个十六进制双精度数还是两个整数 0x1e 和 2 之和?什么时候我们 把e改成p,歧义就解决了:
0x1p+2
【讨论】: