首页 > 解决方案 > 如果次正规数的存在是可选的(HAS_SUBNORM),那么为什么 FP_SUBNORMAL 的存在是强制性的?

问题描述

如果次正规数的存在是可选的(HAS_SUBNORM特征宏),那么为什么FP_SUBNORMAL分类宏的存在是强制性的?

问题的原因:在这个(仍然没有回答的)问题中得出结论/假设:

如果 HAS_SUBNORM 为 0,则使用手动构造的次正规数表示的输入执行任何FP 操作(通过联合使用类型双关、使用 memcpy、从文件读取等构造)会导致未定义的行为 (UB)。

这个结论/假设导致了多个问题:

  1. 这是否意味着如果HAS_SUBNORM is 0无法使用 C 标准库来检测是否存在例如用户提供的次正规数?

例子:

float value = get_value();       // user input
#if FLT_HAS_SUBNORM == 0
int class = fpclassify( value ); // leads to UB if value is subnormal number
if ( class == FP_SUBNORMAL  )
{
    error( "subnormal numbers are not supported" );
}
#endif
  1. 是否应该FP_SUBNORMAL依赖于HAS_SUBNORM设置为的宏的析取1?IE:
#if FLT_HAS_SUBNORM == 1 || DBL_HAS_SUBNORM == 1 || LDBL_HAS_SUBNORM == 1
// FP_SUBNORMAL is present
#else
// FP_SUBNORMAL is absent
#endif
  1. 分类宏是强制性的这一事实是否FP_SUBNORMAL意味着在使用手动构造的次正规数表示的输入HAS_SUBNORM is 0执行fpclassify宏的情况下将导致明确定义的行为?

UPD 20210527。与舍入模式(C11,7.6.8)相比(强调添加):

当且仅当实现支持通过 fegetround 和 fesetround 函数获取和设置表示的舍入方向时,才会定义每个宏 FE_DOWNWARD ...。

标签: cfloating-pointlanguage-lawyerc11c17

解决方案


推荐阅读