十六进制浮点字面量(1.7.0-dev / v4.38)
English summary. C99 hex-float literals:
0x1.8p+1(hex digits, optional.frac, requiredp±exp); exact binary64 conversion (≤53 bits exact; >53 bits RNE); exact value > DBL_MAX is compile-time loud, underflow to ±0; qbc type12 raw bits → VM/AOT bit-identical. Limits:prequired, raw literal ≤2048 B, host C99 strtod dependency; decimal correct rounding is a separate path.
Q+ 1.4.8 引入(当前 spec v4.36,仍支持) C99 十六进制浮点字面量,用于精确表达 binary64 值。 本页记录语法、转换语义、限制与 VM/AOT 行为。
语法
[+-] 0x hexdigits [ "." hexdigits ] ( "p" | "P" ) [+-] decimal_digits
p/P指数必需(0x1.8不是浮点字面量;0x后无./p仍是普通十六进制整数);- 例:
0x1.8p+1= 3.0、0x1p-1074= 最小次正规、0x1.fffffffffffffp+1023=DBL_MAX; - 负号由一元负号处理(与十进制字面量一致)。
fn main() -> i32 {
print_float(0x1.8p+1)
print(" ")
print_float(0x1p-1074)
print(" ")
print_float(0x1.fffffffffffffp+1023)
print("\n")
return 0
}
转换语义(精确优先)
- hex 值 =
D * 2^p / 16^m(D为全部 hex 数字组成的整数,m为小数 hex 位数); - binary64 有限范围内精确:≤53 位有效位无舍入;>53 位按 round-to-nearest-even;
- 精确值 > DBL_MAX → 编译期 loud(
Error: float literal out of range (|literal| > DBL_MAX)); - 下溢按 IEEE 渐进:低于最小次正规一半 → ±0,不报错;
- 实现链:qboot lexer 保留 raw 区间 → 编译期 native
sys_f64_bits_from_hex(C99 hex strtod + 精确 >DBL_MAX 判定)→ qbc type12 raw bits → VM/AOT 同 bits 逐位一致(不重建浮点)。
与十进制正确舍入的关系
| 字面量 | 1.4.7-dev / v4.33 | 1.4.8-dev / v4.34 |
|---|---|---|
十进制 f64(如 0.1) | 任意精度正确舍入(type12 raw bits) | 同 v4.33 |
十六进制 f64(如 0x1.8p+1) | 不支持 | 精确转换(>53 位 RNE;超 DBL_MAX loud) |
两者都走 qbc type12 raw IEEE bits,VM/AOT 不重新做浮点解析。
限制(不得宣称无边界)
- 依赖宿主 C 库的 C99 hex
strtod支持;raw literal ≤2048 字节;p指数必需; - 超
DBL_MAX是编译期 loud(不静默),下溢按 IEEE 归 ±0; - 不宣称任意宿主/任意长度/无 strtod 依赖;plain hex 整数行为不变;
- fixtures:
aot_float/p06_hex_float.q、n04_hex_overflow.q;Cstrtodbits 对照 13/13 PASS。
复跑
tools/build.sh
tools/test.sh
# 手动 bits 对照(可选):tools/manual/f64_hex_qbc_check.py
发布候选(NOT PUBLISHED);站点/文档不构成发布声明。相关:十进制字面量定义域见 docs/qplus_language_spec.md §9.5.10/§10.2;qfmt 与格式化见 qfmt 页。