为啥 abs() 和 fabs() 在 C 的两个不同头文件中定义

Posted

技术标签:

【中文标题】为啥 abs() 和 fabs() 在 C 的两个不同头文件中定义【英文标题】:why is abs() and fabs() defined in two different headers in C为什么 abs() 和 fabs() 在 C 的两个不同头文件中定义 【发布时间】:2016-08-23 09:56:48 【问题描述】:

标准库函数abs()stdlib.h中声明,而fabs()math.h中。

为什么它们位于不同的标题中?

【问题讨论】:

abs() 用于int 类型,fabs() 用于double 我把它归结为历史原因。 @WeatherVane 我认为 OP 知道这一点。他很好奇为什么它们在不同的标题中。 我会说这很明显;因为当您不使用浮点运算时,您不会想要 math.h 标头,相反,fabs 属于其他浮点定义。 因为在创建 C 时,FPU 很少出现,所以浮点函数被放在单独的库和头文件中。这个答案有更多信息:***.com/a/1034012/2709018 【参考方案1】:

math.h 首次出现在 7th Research Unix。很难说它是如何到达那里的。例如,[1] 声称 C 库的一些部分是从“PWB/Unix”合并而来的,其中包括 troff 和 C 编译器 pcc,但我无法证明这一点。

另一个有趣的信息是来自 V7 Unix 的库手册: intro.3:

(3)   These functions, together with those of section 2 and those marked (3S),
      constitute library libc, which is automatically loaded by the C compiler
      cc(1) and the Fortran compiler f77(1).  The link editor  ld(1)  searches
      this  library  under  the  `-lc' option.  Declarations for some of these
      functions may be obtained from include files indicated on the  appropri-
      ate pages.

<...>

(3M)  These  functions  constitute the math library, libm.  They are automati-
      cally loaded as needed by the Fortran compiler f77(1).  The link  editor
      searches  this  library  under the `-lm' option.  Declarations for these
      functions may be obtained from the include file <math.h>.

如果您查看 V7 命令的 makefile,只有少数 C 程序与 -lm 标志链接。所以我的结论是推测性的:

    libm.a(和math.h)主要用于 FORTRAN 程序,因此它被分离到库中以减少二进制占用(注意它是静态链接的)。 没有多少机器支持浮点。例如,您需要为 PDP-11 [2]购买一个可选的 FPP,Unix 中还有 libfpsim 模拟库来缓解这种情况,因此浮点很难在早期的 C 程序中使用。

1.A History of UNIX before Berkeley: UNIX Evolution: 1975-1984

2. PDP-11 architecture

【讨论】:

【参考方案2】:

像 + - / * 这样的大多数运算符也是数学运算符,但它们也很容易获得。在编程时,你使用了太多的数学,以至于开发人员已经开始区分日常事物所需的数学和只在某些时候使用的更专业的数学。 Abs 是那些经常使用的功能之一。当您只想知道计算内存块大小的差异时,就像指针算术一样。但是你不想知道哪个内存更高哪个更低。

所以总结一下:abs 经常被使用,因为它计算两个整数的差。例如,两个指针之间的差异也是一个整数。所以它在 stdlib.h 中。除非您正在做数学特定的事情,否则晶圆厂永远不是您需要的东西。因此它在 math.h 中。

【讨论】:

这并不能解释为什么这些函数在单独的文件中。 @HolyBlackCat:现在可以了 :) “[...] 因为它计算两个整数的差”。不,它没有,因为它接收单个整数值参数,该参数可以是整数文字或表达式并返回绝对值(或者简单地说,是与零的距离)。用于计算内存块大小的内存地址减法可能是作为函数参数提供的表达式,即作为结果评估为单个值并且不对应于 abs 函数本身的功能。

以上是关于为啥 abs() 和 fabs() 在 C 的两个不同头文件中定义的主要内容,如果未能解决你的问题,请参考以下文章

C语言,fabs有多个重载函数,请问是哪里错了,急在线等

C语言中有没有求绝对值的函数啊?谢谢!

abs和fabs有啥区别?

机试练习总结01:fabs和abs

关于math头文件

应用于浮点值时,std::abs 和 std::fabs 之间有啥区别吗?