必要的 C 编译器标志以检查 MacOS(旧的和新的)是否符合 IEEE-754

Necessary C compiler flags to check MacOS (old and new) for IEEE-754 compliance

似乎 __STDC_IEC_559__ 不足以测试 Apple 生态系统内的 IEEE-754 合规性,这导致了我的问题:

哪个 MacOS 完全支持 IEEE-754 或至少支持 binary32 和 binary64 格式的部分,以及如何使用一个或多个 C 预处理器宏对其进行测试?

It seems as if __STDC_IEC_559_ is insufficient to test for IEEE-754 compliance within the Apple ecosystem.

是也不是。一方面,它部分取决于您的编译器,而不仅仅是 OS。另一方面,您需要注意如何解释编译器对该宏的使用。

作为初步事项,在 C99 中引入了 __STDC_IEC_559__ 宏(注意:两个 尾部下划线)。仍然有不符合 C99 的编译器,至少在默认情况下是这样。为了使测试 __STD_IEC_559__ 有意义,那么,您应该首先检查编译器是否声称符合 C99 或更高版本:

#if __STDC__ && __STDC_VERSION__ >= 19901L
// __STDC_IEC_559__ may tell us something ...
#endif

假设您正在使用一个符合规范的实现,接下来您需要了解如果一个实现将 __STDC_IEC_559__ 定义为 1,则它断言它符合 all 标准附件 F (C11) 或附件 G (C99) 中的规范,其中不仅涵盖浮点数据格式,还涵盖相当广泛的运算符和函数规范,包括错误边界。定义的 __STDC_IEC_559__ not 没有说明哪些部分不受支持。实际上,如今几乎每个人都使用 ISO 60559 数据格式,但完全符合 ISO 60559 的情况相对较少。

Which MacOS does support IEEE-754 full or at least the part with the binary32 and binary64 format and how to test for it with one or more C preprocessor macros?

据我所知,Intel 芯片上的所有版本的 MacOS / OS X 运行 都支持 binary32 和 binary64 作为本机浮点格式。这些平台的所有通用编译器都将这些本机类型映射到 C floatdouble。然而,没有可靠的标准方法来获得 C 预处理器测试,因为没有标准宏提供该信息,而实际测试将需要预处理器不执行的浮点数学运算。

最接近通过预处理器测试数据格式的方法是包含 float.h 并检查定义类型 floatdouble 特征的宏。但即使这些特征与 binary32 / binary64 的特征完全匹配,也不能证明内存中的实际表示采用这些形式。如果您特别关心表示,那么您将需要一个外部测试程序。