不同AWK版本最小双精度浮点下溢阈值差异及IEEE 754合规性问询
AWK实现与IEEE 754标准兼容性问题解答
不同AWK实现版本在数值下溢为0之前可识别的最小非零数值存在差异:
mawk 1.3.4、mawk 1.9.9.6、macOS内置nawk
三者支持的最小阈值均为2^-1074
即4.94 x 10^-324
但未启用GMP或MPFR的gawk 5.1.0版本支持的最小阈值仅到2^-1023
即1.11 x 10^-308
兼容性判定
mawk 1.3.4、mawk 1.9.9.6、macOS内置nawk的实现符合IEEE 754双精度浮点数标准规范。
判定依据
IEEE 754-2008标准定义的64位双精度浮点数支持次正规(非规格化)数值机制:
- 64位存储结构由1位符号位、11位指数位、52位尾数位组成
- 指数位不全为0时为规格化数,隐含尾数前导1,最小规格化非零值为
2^-1022 - 指数位全为0时为次正规数,隐含尾数前导0,可表示比规格化数更小的非零值,最小可识别非零值为
2^-1074,和上述三款AWK的阈值完全匹配。
未启用GMP/MPFR扩展的gawk 5.1.0采用了次正规数直接刷新为0的性能优化策略,该行为不符合IEEE 754标准的默认要求。
gawk下的兼容变通方案
如果需要在未启用任意精度扩展的gawk中获取IEEE 754标准规定的最小非零值,可以使用以下两种拆分计算方式:
exp(-log(2)*(1024-1+52-1))
或者
2^-(1024-1) * 2^-(52-1)
上述写法为便于理解数值推导逻辑的展开形式,对应的简写形式为:
exp(-1074 * log(2))(2^-51) * (2^-1023)
内容的提问来源于stack exchange,提问作者RARE Kpop Manifesto
相关产品推荐
相关产品推荐

