首页 > 解决方案 > 在编译时检测 IEEE-754 浮点表示

问题描述

我正在寻找一种方法来检测 C 编译器是否在编译时使用 IEEE-754 浮点表示,最好是在预处理器中,但常量表达式也可以。

请注意,__STDC_IEC_559__宏不适合此目的,因为实现可能使用正确的表示,但不完全支持附件 F。

标签: cieee-754compile-time

解决方案


不是一个绝对 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 有效负载:通常的嫌疑人。


推荐阅读