为什么 fpclassify() 宏是在 math.h 而不是 float.h 中定义的?

Why fpclassify() macro is defined in math.h and not in float.h?

N2479 C17..C2x 工作草案 — 2020 年 2 月 5 日 ISO/IEC 9899:202x (E):

7.12.3.1 The fpclassify macro:
Synopsis
#include <math.h>
int fpclassify(real-floating x);

为什么 fpclassify() 宏是在 math.h 而不是 float.h 中定义的?

动机/理由/论证是什么?

虽然我不能代表 C 标准委员会成员发言,或者 为什么 他们选择了一个而不是另一个,但我可以<float.h> header 包含(大部分)定义任何 architecture-specific 属性的 compile-time 常量 的定义各种 floating-point 数据类型的(特征)。

但是,<math.h> header 提供了包含 C 标准库数学函数的函数原型,以及这些函数使用的相关常量 and/or return(例如FP_INFINITE)。那些函数 return run-time 值.

现在,虽然标准将 fpclassify 定义为 ,但任何实现都只能根据代码(很可能涉及函数调用)来定义 –必要性——在 运行 时间进行评估。 (否则它会如何处理作为参数给出的变量?)

根据 C 2018 5.2.4.2.2,float.h 提供“浮动类型的特征”。因此,它定义了描述 类型 的宏,例如描述它们的精度和范围、使用什么基数等。这些都是在设计C实现的时候就解决了。

fpclassify 是对 的操作。结果是根据参数计算的,因此它是一个值的数学函数,而不是 floating-point 类型的特征。

另请注意,<float.h><limits.h> 与其他 headers 分开指定。这两个在 C 标准的“环境限制”部分,涵盖了 C 实现的特性。 (它们也作为参考“环境限制”部分的存根列在“库”部分中。)