c - 在编译时检测 IEEE-754 浮点表示
问题描述
我正在寻找一种方法来检测 C 编译器是否在编译时使用 IEEE-754 浮点表示,最好是在预处理器中,但常量表达式也可以。
请注意,__STDC_IEC_559__
宏不适合此目的,因为实现可能使用正确的表示,但不完全支持附件 F。
解决方案
不是一个绝对 100% 的解决方案,但会让你几乎接近。
检查浮点类型的特征是否double
匹配binary64:
#include <float.h>
#define BINARY64_LIKE ( \
(FLT_RADIX == 2) \
(DBL_MANT_DIG == 53) \
(DBL_DECIMAL_DIG == 17) \
(DBL_DIG == 15) \
(DBL_MIN_EXP == -1021) \
(DBL_HAS_SUBNORM == 1) \
(DBL_MIN_10_EXP == -307) \
(DBL_MAX_EXP == +1024) \
(DBL_MAX_10_EXP == +308))
BINARY64_LIKE
在编译时可用。但是对于没有定义它们的旧编译器需要额外的工作:DBL_HAS_SUBNORM
从 C11 开始。
同样对于float
.
从 C11 开始,代码可以_Static_assert()
用来检测一些属性。
_Static_assert(sizeof(double)*CHAR_BIT == 64, "double unexpected size");
另请参阅除了 IEEE754 之外,还有其他常用的浮点格式吗?.
我使用的最后一个非 IEEE754 FP 格式是5 年前的CCSI 。
警告:不清楚为什么OP 想要这个测试。如果代码正在对浮点进行一些位操作,即使已__STDC_IEC_559__
定义,仍然至少存在一个漏洞:浮点和整数的字节序可能不同 - 不常见 - 但在那里。
其他潜在漏洞:支持 -0.0、NaN 符号、无穷大编码、信号 NaN、安静 NaN、NaN 有效负载:通常的嫌疑人。
推荐阅读
- python - 填充二维数组以计算两个 linspaces 的函数
- amazon-web-services - 将 AWS EBS 根卷(加密)引导至安全模式
- bash - 在 bash 中使用包含参数列表的变量
- php - php 邮件返回 FALSE 而 error_get_last() 返回 NULL
- powershell - 使用备用 BaseName 查找 (CSV) 名称重命名文件
- android-studio - Webview问题,pdf链接打不开,请帮忙
- python - 如何在python中返回时始终强制调用类方法
- python - 无法使用 Pandas 删除 NaN 值
- python-3.x - 在我的 python 3.6.6 中安装 opencv 时出错
- python - 我已经安装了 pygame。pycharm给了我未安装的pygame