Las operaciones matemáticas C son un grupo de funciones en la biblioteca estándar del lenguaje de programación C que implementa 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 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 C también se incluyen, pero solo como una característica de compatibilidad obsoleta).
Resumen de funciones
La mayoría de las funciones matemáticas están definidas en
(
encabezado en C ++). Las funciones que operan sobre números enteros, tales como abs
, labs
, div
, y ldiv
, en cambio se definen en la
cabecera (
cabecera en C ++).
Cualquier función que opere en ángulos usa radianes como unidad de ángulo. [1]
No todas estas funciones están disponibles en la versión C89 del estándar. Para aquellos que lo son, las funciones aceptan solo tipo double
para los argumentos de punto flotante, lo que lleva a costosas conversiones de tipo en el código que de otra manera usaba float
valores de precisión simple . En C99, esta deficiencia se solucionó mediante la introducción de nuevos conjuntos de funciones que funcionan float
y long double
argumentos. Estas funciones se identifican con sufijos f
y l
respectivamente. [3]
Función | Descripción | |
---|---|---|
abs labs llabs | calcula el valor absoluto de un valor entero | |
fabs | calcula el valor absoluto de un valor de punto flotante | |
div ldiv lldiv | calcula el cociente y el resto de la división entera | |
fmod | resto de la operación de división de punto flotante | |
remainder | resto firmado de la operación de división | |
remquo | resto con signo, así como los tres últimos bits de la operación de división | |
fma | operación fusionada de suma múltiple | |
fmax | mayor de dos valores de coma flotante | |
fmin | menor de dos valores de coma flotante | |
fdim | diferencia positiva de dos valores de coma flotante | |
nan nanf nanl | devuelve un no-número (NaN) | |
exponenciales funciones | exp | devuelve e elevado a la potencia dada |
exp2 | devuelve 2 elevado a la potencia dada | |
expm1 | devuelve e elevado a la potencia dada, menos uno | |
log | calcula el logaritmo natural (en base e) | |
log2 | calcula el logaritmo binario (en base 2) | |
log10 | calcula el logaritmo común (en base 10) | |
log1p | calcula el logaritmo natural (en base e) de 1 más el número dado | |
ilogb | extrae exponente del número | |
logb | extrae exponente del número | |
Funciones de potencia | sqrt | calcula la raíz cuadrada |
cbrt | calcula la raíz cúbica | |
hypot | calcula la raíz cuadrada de la suma de los cuadrados de dos números dados | |
pow | eleva un número a la potencia dada [4] | |
Funciones trigonométricas | sin | calcula el seno |
cos | calcula el coseno | |
tan | calcula la tangente | |
asin | calcula el seno del arco | |
acos | calcula el coseno del arco | |
atan | calcula el arco tangente | |
atan2 | calcula el arco tangente, usando signos para determinar cuadrantes | |
Funciones hiperbólicas | sinh | calcula el seno hiperbólico |
cosh | calcula el coseno hiperbólico | |
tanh | calcula la tangente hiperbólica | |
asinh | calcula el seno de arco hiperbólico | |
acosh | calcula el coseno de arco hiperbólico | |
atanh | calcula el arco tangente hiperbólico | |
Funciones de error y gamma | erf | calcula la función de error |
erfc | calcula la función de error complementaria | |
lgamma | calcula el logaritmo natural del valor absoluto de la función gamma | |
tgamma | calcula la función gamma | |
Operaciones de punto flotante entero más cercano | ceil | devuelve el número entero más cercano no menor que el valor dado |
floor | devuelve el número entero más cercano no mayor que el valor dado | |
trunc | devuelve el número entero más cercano no mayor en magnitud que el valor dado | |
round lround llround | devuelve el número entero más cercano, redondeando desde cero en casos intermedios | |
nearbyint | devuelve el entero más cercano usando el modo de redondeo actual | |
rint lrint llrint | devuelve el entero más cercano usando el modo de redondeo actual con excepción si el resultado es diferente | |
Flotante de punto de manipulación de funciones | frexp | descompone un número en un significado y una potencia de 2 |
ldexp | multiplica un número por 2 elevado a una potencia | |
modf | descompone un número en partes enteras y fraccionarias | |
scalbn scalbln | multiplica un número por FLT_RADIX elevado a una potencia | |
nextafter nexttoward | devuelve el siguiente valor de punto flotante representable hacia el valor dado | |
copysign | copia el signo de un valor de punto flotante | |
Clasificación | fpclassify | categoriza el valor de punto flotante dado |
isfinite | comprueba si el número dado tiene un valor finito | |
isinf | comprueba si el número dado es infinito | |
isnan | comprueba si el número dado es NaN | |
isnormal | comprueba si el número dado es normal | |
signbit | comprueba si el número dado es negativo |
Entorno de punto flotante
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, cuando los números se vacían a cero, etc. los tipos se definen en el
encabezado (
en C ++ ).
Función | Descripción |
---|---|
feclearexcept | borra excepciones ( C99 ) |
fegetenv | almacena el entorno de punto flotante actual ( C99 ) |
fegetexceptflag | almacena banderas de estado actual ( C99 ) |
fegetround | recupera la dirección de redondeo actual ( C99 ) |
feholdexcept | guarda el entorno de punto flotante actual y borra todas las excepciones ( C99 ) |
feraiseexcept | genera una excepción de punto flotante ( C99 ) |
fesetenv | establece el entorno de punto flotante actual ( C99 ) |
fesetexceptflag | establece banderas de estado actual ( C99 ) |
fesetround | establece la dirección de redondeo actual ( C99 ) |
fetestexcept | comprueba si se han planteado determinadas excepciones ( C99 ) |
feupdateenv | restaura el entorno de punto flotante, pero mantiene las excepciones actuales ( C99 ) |
Números complejos
C99 agrega una nueva _Complex
palabra clave (y complex
una macro de conveniencia) que brinda soporte para números complejos. Cualquier tipo de coma flotante se puede modificar con complex
, y luego se define como un par de números de coma flotante. Tenga en cuenta que C99 y C ++ no implementan números complejos de una manera compatible con el código; este último, en cambio, proporciona la clase .std::complex
Todas las operaciones con números complejos se definen en el
encabezado. Al igual que con las funciones con valores reales, un sufijo f
o l
denota la variante float complex
o long double complex
de la función.
Función | Descripción | |
---|---|---|
Operaciones basicas | cabs | calcula el valor absoluto ( C99 ) |
carg | calcula el argumento de un número complejo ( C99 ) | |
cimag | calcula la parte imaginaria de un número complejo ( C99 ) | |
creal | calcula la parte real de un número complejo ( C99 ) | |
calcula conjugado complejo ( C99 ) | ||
cproj | calcula la proyección compleja en la esfera de Riemann ( C99 ) | |
Operaciones de exponenciación | cexp | calcula exponencial complejo ( C99 ) |
clog | calcula logaritmos complejos ( C99 ) | |
csqrt | calcula la raíz cuadrada compleja ( C99 ) | |
cpow | calcula potencia compleja ( C99 ) | |
Operaciones trigonométricas | csin | calcula el seno complejo ( C99 ) |
ccos | calcula el coseno complejo ( C99 ) | |
ctan | calcula la tangente compleja ( C99 ) | |
casin | calcula el seno de arco complejo ( C99 ) | |
cacos | calcula el coseno de arco complejo ( C99 ) | |
catan | calcula el arco tangente complejo ( C99 ) | |
Operaciones hiperbólicas | csinh | calcula el seno hiperbólico complejo ( C99 ) |
ccosh | calcula el coseno hiperbólico complejo ( C99 ) | |
ctanh | calcula la tangente hiperbólica compleja ( C99 ) | |
casinh | calcula el seno de arco hiperbólico complejo ( C99 ) | |
cacosh | calcula el coseno de arco hiperbólico complejo ( C99 ) | |
catanh | calcula el arco tangente hiperbólico complejo ( C99 ) |
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 forman parte de la biblioteca estándar.
Función | Descripción | |
---|---|---|
Funciones de error | cerf | calcula la función de error compleja ( C99 ) |
cerfc | calcula la función de error complementario complejo ( C99 ) |
Funciones de tipo genérico
El encabezado
define una macro genérica de tipo para cada función matemática definida en
y
. Esto agrega un soporte limitado para la sobrecarga de funciones de las 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 el momento de la compilación de acuerdo con los tipos de parámetros.
Cada macro de tipo genérico que corresponde a una función que se define para ambos números reales y complejos encapsula un total de 6 funciones diferentes: float
, double
y long double
, y sus complex
variantes. Las macros de tipo genérico que corresponden a una función que se define únicamente para los números reales encapsula 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
encabezado ni siquiera como característica de compatibilidad.
Generación de números aleatorios
El encabezado
(
en C ++) define varias funciones que se pueden utilizar para la generación de números estadísticamente aleatorios. [6]
Función | Descripción |
---|---|
rand | genera un número pseudoaleatorio entre 0 e RAND_MAX inclusive. |
srand | inicializa un generador de números pseudoaleatorios |
arc4random | genera un número pseudoaleatorio entre 0 y UINT32_MAX , generalmente usando un algoritmo mejor querand |
arc4random_uniform | genera un número pseudoaleatorio entre 0 y un valor máximo. |
arc4random_buf | llenar un búfer con un flujo de bits pseudoaleatorio. |
arc4random_stir | inicializa un generador de números pseudoaleatorios . |
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 flujo de claves de una versión filtrada del cifrado RC4 (de ahí " un RC4 lleno "), pero se han implementado diferentes algoritmos, generalmente de otros cifrados como ChaCha20 , desde que se usa el mismo nombre.
La calidad de la aleatoriedad rand
suele ser demasiado débil para siquiera considerarse estadísticamente aleatoria, y requiere una siembra explícita. Por lo general, se recomienda usarlo en arc4random
lugar de rand
cuando sea posible. Algunas bibliotecas de C implementan el rand
uso arc4random_uniform
interno.
Implementaciones
En sistemas POSIX como Linux y BSD , las funciones matemáticas (como se declaran en
) se agrupan por separado en la biblioteca matemática . Por lo tanto, si se utiliza alguna de esas funciones, el vinculador debe recibir la directiva . Hay varias implementaciones, que incluyen:libm
-lm
libm
- GNU libc 's libm
- AMD 's libm
- Red Hat 's libm
- Sun 's FDLIBM , que se utilizó como base para FreeBSD ' s masas solares y OpenBSD 's libm , los cuales a su vez fueron la base de Julia ' s OpenLibm
- libm de musl , basado en los libms de BSD y otros proyectos como ARM
- CRlibm del proyecto Arénaire ( libm correctamente redondeado ) y su sucesor MetaLibm . Utiliza el algoritmo Remez para generar automáticamente aproximaciones probadas formalmente.
Las implementaciones no necesariamente bajo el nombre de libm
incluyen:
- ARM 's rutinas matemáticas optimizadas
- GCE-Math es una versión de funciones matemáticas C / C ++ escritas para C ++
constexpr
(cálculo en tiempo de compilación) - Las bibliotecas matemáticas SIMD (vectorizadas) incluyen SLEEF , Yeppp! y VCL de Agner Fog , además de algunos de código cerrado como SVML y DirectXMath. [7]
Ver también
- Soporte de punto flotante C99
Referencias
- ^ a b Especificación ISO / IEC 9899: 1999 (PDF) . pag. 212, párrafo 7.12.
- ^ Prata, Stephen (2004). C primer plus . Sams Publishing. Apéndice B, Sección V: La biblioteca estándar ANSI C con adiciones C99. ISBN 0-672-32696-5.
- ^ a b Prata, Stephen (2004). C primer plus . Sams Publishing. Apéndice B, Sección VIII: Mejoras computacionales numéricas C99. ISBN 0-672-32696-5.
- ^ Notacionalmente, puede parecer conveniente usar pow ( x , 2) o pow ( x , 3) para calcular cuadrados o cubos. Sin embargo, esto no es aconsejable en código de tiempo crítico. A menos que una implementación tenga especial cuidado con estos casos en tiempo de compilación, x * x o x * x * x se ejecutará mucho más rápido. Además, sedeben preferirsqrt ( x ) y cbrt ( x ) sobre pow ( x , .5) o pow ( x , 1. / 3).
- ^ man cerf (3), man cerfc (3), ver, por ejemplo, https://linux.die.net/man/3/cerf .
- ^ "La biblioteca GNU C - ISO aleatorio" . Consultado el 18 de julio de 2018 .
- ^ Cordes, Peter. "intel - ¿Dónde está intrínseco '_mm256_pow_ps' de Clang?" . Desbordamiento de pila .
enlaces externos
- : declaraciones matemáticas - Referencia de definiciones de base, la especificación única de UNIX , número 7 de The Open Group
- Referencia de C para funciones matemáticas