为什么 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 实现的特性。 (它们也作为参考“环境限制”部分的存根列在“库”部分中。)
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 实现的特性。 (它们也作为参考“环境限制”部分的存根列在“库”部分中。)