简单的问题:如果FLT_HAS_SUBNORM
是 0,那么转换应该(float)1E-45
返回0x1p-149
吗?
问题的原因:ISO/IEC 9899:2011 (E) 指定了FLT_HAS_SUBNORM
/ DBL_HAS_SUBNORM
only wrt floating-point operations 的行为。根据 H.2.3.2(浮点运算),浮点精度(取自 F.3 运算符和函数的术语)之间的转换不是浮点运算。因此,为FLT_HAS_SUBNORM
/指定的行为与浮点精度之间DBL_HAS_SUBNORM
的转换无关。因此,结论是转换将返回。这个结论正确吗?(float)1E-45
0x1p-149
UPD:解释这些问题的原因:目前我有一些测试来测试 FP 操作生成的结果的正确性(包括转换)。FLT_HAS_SUBNORM is 0
我在使用和 的环境下运行这些测试FLT_HAS_SUBNORM is -1
。主要问题是在编译器选项的某些组合中,某些测试失败了。例如:在FLT_HAS_SUBNORM is 0
:
- 硬件(FPU)FP:
(float)1E-45
返回0x1p-149f
- SW (libfp) FP:
(float)1E-45
返回0.0f
测试参考值:0.0f
.
因此,有必要了解是否:
- 测试有一个错误(写错了:例如,没有检查
HAS_SUBNORM
);或者 - 编译器有错误;或者
- SW (libfp) FP 有一个错误;或者
- HW (FPU) FP 有一个错误(模拟器中的错误;它也会发生);或者
- 先前案例的所有可能组合。
第一步是阅读标准(C / IEEE 754)并尝试回答开放性问题。然而,事实证明,wrt FP 的许多方面都没有明确定义。因此,处理现有失败测试的情况的最合理方法是什么?
另请注意,理想情况下,测试是以“通用方式”独立编写的(检查系统/环境的功能:检查功能宏、检查限制等),即不知道特定编译器的特定 FP 细节用于 FP 计算(或者人们称之为FP environment)。