Стандартная библиотечная функция abs()
объявляется в stdlib.h
, а fabs()
находится в math.h
.
Почему они находятся в разных заголовках?
Стандартная библиотечная функция abs()
объявляется в stdlib.h
, а fabs()
находится в math.h
.
Почему они находятся в разных заголовках?
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.a
(и math.h
) в первую очередь был необходим для программ FORTRAN в основном, поэтому он был разделен на библиотеку для уменьшения двоичного следа (обратите внимание, что он был связан статически).Большинство операторов, таких как + -/*, также являются математическими операторами, но они также легко доступны. При программировании вы используете так много математики, что разработчики начали различать математику, которая необходима для повседневных вещей и математики, которая более специализирована, и вы используете ее только некоторое время. Abs - одна из тех функций, которые часто используются. Как с арифметикой указателя, когда вы просто хотите узнать разницу, чтобы вычислить размер блока памяти. Но вам не интересно знать, что выше в памяти и что ниже.
Итак, чтобы подвести итог: abs используется часто, потому что он вычисляет разность двух целых чисел. Разница между двумя указателями, например, также является целым числом. И так это в stdlib.h. fabs, как бы то ни было, вам не понадобится много, если вы не будете заниматься математикой. Таким образом, он находится в math.h.