0

简单的问题:如果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-450x1p-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)。

4

0 回答 0