2016-08-23 13 views
14

Стандартная библиотечная функция abs() объявлена ​​в stdlib.h, а fabs() - в math.h.Почему abs() и fabs() определены в двух разных заголовках в C

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

+3

'абс()' 'для int' типа,' FABS() '' для double'. –

+4

Я положил его на исторические причины. – Bathsheba

+2

@WeatherVane Я думаю, что OP это знает. Ему любопытно, почему они находятся в разных заголовках. – Mirakurun

ответ

-1

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

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

+0

Это не отвечает, почему эти функции находятся в отдельных файлах. – HolyBlackCat

+0

@HolyBlackCat: Он делает сейчас :) –

5

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>. 

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

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

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

2. PDP-11 architecture