Почему abs() и fabs() определены в двух разных заголовках в C

Стандартная библиотечная функция abs() объявляется в stdlib.h, а fabs() находится в math.h.

Почему они находятся в разных заголовках?

Ответы

Ответ 1

math.h сначала появляется в 7-м Исследовательском 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>.

Если вы посмотрите на make файлы команд V7, только несколько программ на C связаны с флагом -lm. Поэтому мой вывод является умозрительным:

  • libm.amath.h) в первую очередь был необходим для программ FORTRAN в основном, поэтому он был разделен на библиотеку для уменьшения двоичного следа (обратите внимание, что он был связан статически).
  • Не многие машины имели поддержку с плавающей запятой. Например, вам нужно будет купить опциональную FPP для PDP-11 [2], в Unix также есть библиотека моделирования libfpsim, чтобы уменьшить ее, поэтому с плавающей точкой вряд ли можно использовать в ранних программах на C.

1. История UNIX до Беркли: UNIX Evolution: 1975-1984

2. архитектура PDP-11

Ответ 2

Большинство операторов, таких как + -/*, также являются математическими операторами, но они также легко доступны. При программировании вы используете так много математики, что разработчики начали различать математику, которая необходима для повседневных вещей и математики, которая более специализирована, и вы используете ее только некоторое время. Abs - одна из тех функций, которые часто используются. Как с арифметикой указателя, когда вы просто хотите узнать разницу, чтобы вычислить размер блока памяти. Но вам не интересно знать, что выше в памяти и что ниже.

Итак, чтобы подвести итог: abs используется часто, потому что он вычисляет разность двух целых чисел. Разница между двумя указателями, например, также является целым числом. И так это в stdlib.h. fabs, как бы то ни было, вам не понадобится много, если вы не будете заниматься математикой. Таким образом, он находится в math.h.