【问题标题】:Floating-point: FLT_HAS_SUBNORM is 0 => subnormal value arises => unspecified behavior?浮点数:FLT_HAS_SUBNORM 为 0 => 出现次正常值 => 未指定的行为?
【发布时间】:2021-02-20 16:44:08
【问题描述】:

如果FLT_HAS_SUBNORM is 0 并且如果在执行 FP 操作(add、mul、div 等)期间出现了一个低于正常值的值(或者如果将低于正常值作为这些 FP 操作的输入),那么 FP 引擎的实现(即硬件实现[FPU]、软件实现[SW FP库]、HW-SW混合实现[使用HW指令的SW FP库,后跟额外的SW后处理])可以:

  • 检测此类次正常值并将其设置为零(即flash-to-zero 策略/逻辑);
  • 什么都不做[特殊](导致不可预测的输出结果值)。

问题:有人可以提供一个正确的论点(如果通过引用C / IEEE 754 标准来加强),说服该案例的行为确实属于unspecified behavior 类别?

注意:ISO/IEC 9899:202x (E) 工作草案 - 2020 年 2 月 5 日 N2479:

3.4.4 未指明的行为

由于使用未指定的值或本文档提供了两种或多种可能性并且在任何情况下都没有进一步要求的其他行为而导致的行为

【问题讨论】:

  • C 标准没有详细说明浮点行为,但是任何浮点实现都会对实数结果介于零和小正数之间的运算“做一些事情”可代表的价值。通常,它会根据一些舍入规则对其进行舍入,可能是向零、向最近(使用关于关系的次要规则)、向 +∞ 或其他规则,和/或它会产生异常。实际上没有任何“什么都不做”的实现。
  • @EricPostpischil,谢谢!在“什么都不做”下,我的意思是“什么都不做”(即不执行任何专门用于检测低于正常值的额外逻辑)。那么,如果 C 标准没有准确地说出unspecified behavior,那么哪种行为更能体现这种情况呢? IEEE Std 754-2008 仅提及一次unspecified,与上述情况无关。

标签: c floating-point ieee-754 unspecified-behavior


【解决方案1】:

回复我自己。

在这种情况下:

  1. 该行为未指定。
  2. 行为由 FP 操作的实现定义。因此,行为是实现定义的
  3. 由于没有检测和处理次正规数的逻辑(XXX_HAS_SUBNORM为0),所以输出结果为indeterminate
  4. (额外)这种情况应该被视为“用户错误”(并且违反了XXX_HAS_SUBNORM is 0)。

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 2017-02-18
    • 2011-11-25
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多