c - 如果次正规数的存在是可选的(HAS_SUBNORM),那么为什么 FP_SUBNORMAL 的存在是强制性的?
问题描述
如果次正规数的存在是可选的(HAS_SUBNORM
特征宏),那么为什么FP_SUBNORMAL
分类宏的存在是强制性的?
问题的原因:在这个(仍然没有回答的)问题中得出结论/假设:
如果 HAS_SUBNORM 为 0,则使用手动构造的次正规数表示的输入执行任何FP 操作(通过联合使用类型双关、使用 memcpy、从文件读取等构造)会导致未定义的行为 (UB)。
这个结论/假设导致了多个问题:
- 这是否意味着如果
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
- 是否应该
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
- 分类宏是强制性的这一事实是否
FP_SUBNORMAL
意味着在使用手动构造的次正规数表示的输入HAS_SUBNORM is 0
执行fpclassify
宏的情况下将导致明确定义的行为?
UPD 20210527。与舍入模式(C11,7.6.8)相比(强调添加):
当且仅当实现支持通过 fegetround 和 fesetround 函数获取和设置表示的舍入方向时,才会定义每个宏 FE_DOWNWARD ...。
解决方案
推荐阅读
- ios - 如何在函数的返回语句中插入 UIImage 视图?
- javascript - 我可以将信息从 API 放到另一个页面吗?
- oracle - Oracle 12.2.0.1 中的 Kerberos 身份验证,带有 KERBEROS5PRE 服务和 Cred Cache OSMSFT
- javascript - 流类型:动态获取一个Class方法
- subscription - Laravel Lighthouse,订阅时如何获取所有数组数据?
- javascript - 在反应中传递道具并显示在列表中的方式
- python - nn.MaxPool2d 与 nn.functional.max_pool2d 之间的区别?
- c# - 当我启动它时,我的表单打开然后关闭
- c - 为什么打印二维字符数组会产生垃圾值?
- batch-file - 如何在用户的桌面目录中创建目录?