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

标签 c macos c-preprocessor ieee-754

似乎 __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 floatdouble。然而,没有可靠、标准的方法来获得 C 预处理器测试,因为没有标准宏提供该信息,而实际测试将需要预处理器不执行的 float 学运算。

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

关于c - 必要的 C 编译器标志以检查 MacOS(旧的和新的)是否符合 IEEE-754,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54671503/

相关文章:

java - install4j - jre.bundle 未更新

python - 尽管使用两级命名空间编译,但库仍需要平面命名空间中的符号

c - C 中#define 预处理器的作用域

c - C代码中 `#define`的位置重要吗?

c - 存储固定范围 float 的有效方法

c - 进出子进程的管道不起作用

c - 在c中如何将字符串转换为 double 值?

python - 获取指定函数中调用的所有函数

python - Mac OS X 中文件系统的 Unicode 编码在 Python 中不正确?

objective-c - Xcode 中 #elseifdef 的预处理指令无效