Las operaciones matemáticas de C son un grupo de funciones de la biblioteca estándar del lenguaje de programación C que implementan funciones matemáticas básicas. [1] [2] Todas las funciones utilizan números de punto flotante de una forma u otra. Los diferentes estándares de C proporcionan conjuntos de funciones diferentes, aunque compatibles con versiones anteriores. La mayoría de estas funciones también están disponibles en la biblioteca estándar de C++ , aunque en diferentes encabezados (los encabezados de C también se incluyen, pero solo como una característica de compatibilidad obsoleta).
La mayoría de las funciones matemáticas se definen en el encabezado <math.h>
( <cmath>
en C++). Las funciones que operan con números enteros, como abs
, labs
, div
y ldiv
, se definen en cambio en el <stdlib.h>
encabezado ( <cstdlib>
encabezado en C++).
Cualquier función que opere sobre ángulos utiliza radianes como unidad de ángulo. [1]
No todas estas funciones están disponibles en la versión C89 del estándar. En el caso de las que sí lo están, las funciones solo aceptan el tipo double
para los argumentos de punto flotante, lo que genera costosas conversiones de tipos en código que, de otro modo, utilizaba valores de precisión simple float
. En C99, esta deficiencia se solucionó introduciendo nuevos conjuntos de funciones que funcionan con argumentos float
y long double
. Esas funciones se identifican con los sufijos f
y l
respectivamente. [3]
C99 agrega varias funciones y tipos para un control detallado del entorno de punto flotante. [3] Estas funciones se pueden usar para controlar una variedad de configuraciones que afectan los cálculos de punto flotante, por ejemplo, el modo de redondeo, en qué condiciones ocurren excepciones, cuándo los números se ponen a cero, etc. Las funciones y tipos del entorno de punto flotante se definen en <fenv.h>
header ( <cfenv>
en C++ ).
C99 agrega una nueva _Complex
palabra clave (y complex
una macro de conveniencia; solo disponible si <complex.h>
se incluye el encabezado) que brinda soporte para números complejos. Cualquier tipo de punto flotante se puede modificar con complex
, y luego se define como un par de números de punto flotante. Tenga en cuenta que C99 y C++ no implementan números complejos de una manera compatible con el código; en cambio, este último proporciona la clase .std::complex
Todas las operaciones con números complejos se definen en el <complex.h>
encabezado. Al igual que con las funciones de valor real, el sufijo f
o l
denota la variante float complex
o long double complex
de la función.
Algunas funciones más complejas están "reservadas para uso futuro en C99". [5] Las implementaciones son proporcionadas por proyectos de código abierto que no son parte de la biblioteca estándar.
El encabezado <tgmath.h>
define una macro genérica de tipo para cada función matemática definida en <math.h>
y <complex.h>
. Esto agrega un soporte limitado para la sobrecarga de funciones matemáticas: el mismo nombre de función se puede usar con diferentes tipos de parámetros; la función real se seleccionará en tiempo de compilación según los tipos de parámetros.
Cada macro genérica de tipo que corresponde a una función definida tanto para números reales como complejos encapsula un total de 6 funciones diferentes: float
, double
y long double
, y sus complex
variantes. Las macros genéricas de tipo que corresponden a una función definida solo para números reales encapsulan un total de 3 funciones diferentes: float
, double
y long double
variantes de la función.
El lenguaje C++ incluye soporte nativo para la sobrecarga de funciones y, por lo tanto, no proporciona el <tgmath.h>
encabezado ni siquiera como una característica de compatibilidad.
El encabezado <stdlib.h>
( <cstdlib>
en C++) define varias funciones que se pueden utilizar para la generación estadística de números aleatorios. [6]
La arc4random
familia de funciones de números aleatorios no está definida en el estándar POSIX, pero se encuentra en algunas libc
implementaciones comunes. Solía referirse al generador de secuencia de claves de una versión filtrada del cifrado RC4 (de ahí " un supuesto RC4 "), pero desde entonces se han implementado algoritmos diferentes, generalmente de otros cifrados como ChaCha20 , que utilizan el mismo nombre.
La calidad de la aleatoriedad de rand
es generalmente demasiado débil para ser considerada estadísticamente aleatoria, y requiere una inicialización explícita. Generalmente se recomienda usar arc4random
en lugar de rand
cuando sea posible. Algunas bibliotecas de C implementan rand
el uso arc4random_uniform
de forma interna.
En sistemas POSIX como Linux y BSD , las funciones matemáticas (tal como se declaran en <math.h>
) se agrupan por separado en la biblioteca matemática . Por lo tanto, si se utiliza alguna de esas funciones, se debe proporcionar al enlazador la directiva . Existen varias implementaciones, entre ellas:libm
-lm
libm
libms
, basada en BSD y otros proyectos como ArmLas implementaciones que no necesariamente se realizan bajo un nombre libm
incluyen:
constexpr
(cálculo en tiempo de compilación)