似乎 __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.
是也不是。一方面,它部分取决于您的编译器,而不仅仅是操作系统。另一方面,您需要注意如何解释编译器对该宏的使用。
作为初步事项,__STDC_IEC_559__
宏(注意:两个 尾部下划线)在 C99 中引入。仍然有不符合 C99 的编译器,至少在默认情况下是这样。为了使测试 __STD_IEC_559__
变得有意义,您应该首先检查编译器是否声称符合 C99 或更高版本:
#if __STDC__ && __STDC_VERSION__ >= 19901L
// __STDC_IEC_559__ may tell us something ...
#endif
假设您正在使用一个符合标准的实现,接下来您需要了解,如果一个实现将 __STDC_IEC_559__
定义为 1,则它断言它符合所有标准附件 F (C11) 或附件 G (C99) 中的规范,其中不仅涵盖 float 据格式,还涵盖相当广泛的运算符和函数规范,包括错误边界。定义的 __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 作为 native 浮点格式。这些平台的所有通用编译器都将这些 native 类型映射到 C float
和 double
。然而,没有可靠、标准的方法来获得 C 预处理器测试,因为没有标准宏提供该信息,而实际测试将需要预处理器不执行的 float 学运算。
最接近通过预处理器测试数据格式的方法是包含 float.h
并检查定义 float
和 类型特征的宏>双
。但即使这些特征与 binary32/binary64 的特征完全匹配,也不能证明内存中的实际表示采用这些形式。如果您特别关心表示,那么您将需要一个外部测试程序。
关于c - 必要的 C 编译器标志以检查 MacOS(旧的和新的)是否符合 IEEE-754,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54671503/