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

问题描述 投票:1回答:1

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

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

c macos c-preprocessor ieee-754
1个回答
3
投票

似乎__STDC_IEC_559_不足以在Apple生态系统中测试IEEE-754合规性。

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

作为初步问题,__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)中的所有规范,它不仅包括浮点数据格式,还包括运算符和函数的各种规范,包括误差范围。未定义的__STDC_IEC_559__没有说明哪些部分不受支持。实际上,现在几乎每个人都使用ISO 60559数据格式,但完全符合ISO 60559标准是相对罕见的。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.