¿Por qué se definen abs() y fabs() en dos encabezados diferentes en C?

4 minutos de lectura

Avatar de usuario de Sanjana Jose
sanjana jose

La función de biblioteca estándar abs() se declara en stdlib.htiempo fabs() es en math.h.

¿Por qué residen en diferentes encabezados?

  • abs() es para int escribe, fabs() es para double.

    – Veleta

    23 de agosto de 2016 a las 9:58

  • Lo atribuyo a razones históricas.

    – Betsabé

    23 de agosto de 2016 a las 9:59

  • @WeatherVane Creo que el OP lo sabe. Tiene curiosidad por qué están en diferentes encabezados.

    – Mirakurun

    23 de agosto de 2016 a las 9:59

  • Yo diría que es obvio; porque no querrás el math.h encabezado cuando no está utilizando aritmética de coma flotante y, a la inversa, fabs pertenece a otras definiciones de punto flotante.

    – Veleta

    23/08/2016 a las 10:00


  • Porque cuando se creó C, las FPU eran una ocurrencia rara, por lo que las funciones de coma flotante se colocan en bibliotecas y encabezados separados. Esta respuesta tiene más información: stackoverflow.com/a/1034012/2709018

    – myaut

    23 de agosto de 2016 a las 10:01

matemáticas.h aparece por primera vez en 7th Research Unix. Es difícil decir cómo llegó allí. Por ejemplo, [1] afirma que los bits de la biblioteca C se fusionaron de “PWB/Unix”, que incluía troff y compilador C pccpero no puedo demostrarlo.

Otra información interesante es el manual de la biblioteca de V7 Unix:
introducción.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>.

Si observa los archivos MAKE de los comandos V7, solo unos pocos programas C están vinculados con -lm bandera. Así que mi conclusión es especulativa:

  1. libm.a (y math.h) se necesitaba principalmente para los programas FORTRAN, por lo que se separó en la biblioteca para reducir la huella binaria (tenga en cuenta que estaba vinculado estáticamente).
  2. No muchas máquinas tenían soporte de punto flotante. Por ejemplo, necesitarías comprar un FPP opcional para PDP-11 [2]también hay una biblioteca de simulación libfpsim en Unix para mitigar eso, por lo que el punto flotante apenas se puede usar en los primeros programas C.

1. Una historia de UNIX antes de Berkeley: Evolución de UNIX: 1975-1984

2. Arquitectura PDP-11

Avatar de usuario de Dave Kok
david kok

La mayoría de los operadores como + – / * también son operadores matemáticos, pero también están disponibles. Cuando programa, usa tantas matemáticas que los desarrolladores han comenzado a diferenciar entre las matemáticas que se necesitan para las cosas cotidianas y las matemáticas que son más especializadas y que solo usa algunas veces. Abs es una de esas funciones que se utilizan a menudo. Al igual que con la aritmética de punteros cuando solo desea saber la diferencia para calcular el tamaño de un bloque de memoria. Pero no te interesa saber cuál está más arriba en la memoria y cuál está más abajo.

Entonces, para resumir: abs se usa a menudo porque calcula la diferencia de dos números enteros. La diferencia entre dos punteros, por ejemplo, también es un número entero. Y así es en stdlib.h. Fabs sin embargo, no es algo que necesitará mucho a menos que esté haciendo cosas específicas de matemáticas. Así es en matemáticas.h.

  • Esto no responde por qué esas funciones están en archivos separados.

    – Santo Gato Negro

    23 de agosto de 2016 a las 12:48

  • @HolyBlackCat: Lo hace ahora 🙂

    – Dave Kok

    23 de agosto de 2016 a las 13:34

  • “[…] porque calcula la diferencia de dos enteros”. No, no lo hace, ya que recibe un solo argumento de valor entero, que puede ser un literal entero o una expresión y devuelve el valor absoluto (o en palabras simples, la distancia desde cero). La resta de direcciones de memoria para calcular el tamaño de un bloque de memoria puede ser una expresión proporcionada como argumento a la función, que como resultado se evalúa en un solo valor y no corresponde a la funcionalidad de la función abs. sí mismo.

    – dandev486

    14 de mayo de 2021 a las 11:06


¿Ha sido útil esta solución?