【问题标题】:Necessary C compiler flags to check MacOS (old and new) for IEEE-754 compliance必要的 C 编译器标志来检查 MacOS(旧的和新的)是否符合 IEEE-754
【发布时间】:2019-02-13 22:24:45
【问题描述】:

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

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

【问题讨论】:

  • 也许这个答案stackoverflow.com/a/753018/4944425 的第二部分可能会有所帮助。
  • @Bob__ 检查这些常量需要包含float.h,我想避免这种情况,尽管不是不惜一切代价。
  • Apple 的 macOS、OS X 和 Mac OS 开发工具使用 IEEE-754 基本 32 位和 64 位二进制浮点格式,但不完全符合 IEEE-754。 (从技术上讲,您问题的第一句话是不正确的:__STDC_IEC_559__ 足以测试合规性;它正确地表明实现不合规。)

标签: c macos c-preprocessor ieee-754


【解决方案1】:

似乎 __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__ not 没有说明哪些部分不受支持。实际上,如今几乎每个人都使用 ISO 60559 数据格式,但完全符合 ISO 60559 的情况相对较少。

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

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

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

【讨论】:

  • 很害怕,但不管怎样,想想还是值得的。只会检查我真正需要知道的事情(我只需要*_MAX_EXPFLT_RADIX),然后为其余部分编写独立于arch./mem.-layout 的代码。慢得多,但麻烦也少得多。谢谢!
  • @deamentiaemundi:一个可能的 DeathStation 9000 陷阱是浮点字节序不匹配整数字节序,因此floatuint32_t 的类型双关将具有u32 & 0x80 的符号位。 AFAIK,没有标准的__FLT_ENDIAN__ 宏。但是所有真正的编译器都远远超出了符合标准的范围,而是做出了真正有用的努力。 (实施质量)。 x86 有 little-endian 整数和浮点数,所有主要的 x86 编译器 (gcc/clang/ICC/MSVC) 都是正常的。 (PowerPC 有 big-endian int 和 float,我想,如果你关心 Mac 这么老的话。)
  • @PeterCordes “如果你关心那么老的 Mac” 好吧,我愿意,我当然愿意!我需要的最低限度只是一个 M68K + MMU + FPU(例如:M68040 将它全部合二为一)和一块 RAM。
  • @deamentiaemundi:哦,我只看到了macos标签,错过了标题中的(旧的和新的)。 ieeexplore.ieee.org/document/63685 的摘要证实 68040 硬件使用 IEEE 754 FP 格式(因此旧的 m68k 与 68882 / 68881 也是如此,因为我们知道它们是兼容的),并且 FPU 符合预期。但如果您关心在系统之间移动数据,请注意二进制文件中的浮点字节序问题。
猜你喜欢
  • 1970-01-01
  • 2021-03-19
  • 2022-01-20
  • 1970-01-01
  • 2016-04-06
  • 2021-05-22
  • 2020-11-19
  • 2015-12-21
  • 2013-06-27
相关资源
最近更新 更多