Las operaciones matemáticas de C son un conjunto de funciones de la biblioteca estándar del lenguaje de programación C que implementan funciones matemáticas básicas. [ 1 ] [ 2 ] Los distintos 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 archivos de cabecera (los archivos de cabecera de C también se incluyen, pero solo como una característica de compatibilidad obsoleta).
Descripción general de las funciones
La mayoría de las funciones matemáticas que utilizan números de punto flotante se definen en <math.h>( <cmath>encabezado en C++). Las funciones que operan con enteros , como abs, labs, div, y ldiv, se definen 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. Para aquellas que sí lo están, las funciones solo aceptan el tipo doublepara los argumentos de punto flotante, lo que genera costosas conversiones de tipo en código que de otro modo usaría valores de precisión simple float. En C99, esta deficiencia se solucionó introduciendo nuevos conjuntos de funciones que trabajan con argumentos floaty long double. Estas funciones se identifican con los sufijos fy lrespectivamente. [ 3 ]
Entorno de punto flotante
C99 agrega varias funciones y tipos para un control granular 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 se vacían los números a cero, etc. Las funciones y tipos del entorno de punto flotante se definen en <fenv.h>el encabezado ( <cfenv>en C++ ).
Números complejos
C99 agrega una nueva _Complexpalabra clave (y complexmacro 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; este último en su lugar 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 " for l" denota la variante float complex"or" long double complexde la función.
Algunas funciones más complejas están "reservadas para su uso futuro en C99". [ 5 ] Las implementaciones son proporcionadas por proyectos de código abierto que no forman parte de la biblioteca estándar.
funciones genéricas de tipo
El encabezado <tgmath.h>define una macro genérica para cada función matemática definida en <math.h>y <complex.h>. Esto añade soporte limitado para la sobrecarga de funciones matemáticas: se puede usar el mismo nombre de función con diferentes tipos de parámetros; la función real se seleccionará en tiempo de compilación según los tipos de los 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, doubley long double, y sus complexvariantes. 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, doubley long doublevariantes de la función.
El lenguaje C++ incluye soporte nativo para la sobrecarga de funciones y, por lo tanto, no proporciona el <tgmath.h>archivo de cabecera ni siquiera como característica de compatibilidad.
Generación de números aleatorios
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 arc4randomfamilia de funciones de números aleatorios no está definida en el estándar POSIX, pero se encuentra en algunas libcimplementaciones 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 diferentes algoritmos, generalmente de otros cifrados como ChaCha20 , que utilizan el mismo nombre.
La calidad de la aleatoriedad randsuele ser demasiado débil para considerarse estadísticamente aleatoria, y requiere una inicialización explícita. Generalmente se recomienda usar arc4randomen lugar de randcuando sea posible. Algunas bibliotecas de C implementan randel uso arc4random_uniforminternamente.
Funciones especiales
A partir de C++17 , C++ introduce funciones especiales en el <cmath>archivo de cabecera.
Implementaciones
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-lmlibm
- libm de GNU libc
- La biblioteca libm de AMD , disponible en GitHub , es utilizada casi sin modificaciones por Windows.
- Biblioteca del compilador Intel C++
- libm (Newlib) de Red Hat
- FDLIBM de Sun , que se utilizó como base para msun de FreeBSD y libm de OpenBSD , ambos a su vez como base para OpenLibm de Julia.
- libm de musl , basado en BSD
libmsy otros proyectos como Arm - La biblioteca libm de LLVM , que está correctamente redondeada (es decir, los errores del resultado matemáticamente correcto son menores que 0,5 unidades en el último lugar ) [ 7 ]
- CRlibm (biblioteca de números aleatorios correctamente redondeada) del proyecto Arénaire , y su sucesor MetaLibm , que utiliza el algoritmo de Remez para generar automáticamente aproximaciones que están formalmente probadas.
- RLIBM de Rutger, que proporciona funciones correctamente redondeadas en precisión simple. [ 8 ]
Las implementaciones que no necesariamente se realizan bajo un nombre libmincluyen:
- Rutinas matemáticas optimizadas de Arm
- GCE-Math es una versión de las funciones matemáticas de C/C++ escrita para C++
constexpr(cálculo en tiempo de compilación). - CORE-MATH , correctamente redondeado para precisión simple y doble.
- Las bibliotecas matemáticas SIMD (vectorizadas) incluyen SLEEF , Yeppp! (archivado el 14 de julio de 2020 en Wayback Machine ) y VCL de Agner Fog , además de algunas de código cerrado como SVML y DirectXMath. [ 9 ]
Véase también
Referencias
- 1 2 Especificación ISO/IEC 9899:1999 (PDF) . pág. 212, § 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.
- 1 2 Prata, Stephen (2004). C primer plus . Sams Publishing. Apéndice B, Sección VIII: C99 Mejoras en computación numérica. 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 recomendable en código crítico en cuanto al tiempo de ejecución. A menos que una implementación tenga en cuenta estos casos durante la compilación, x * x o x * x * x se ejecutarán mucho más rápido. Además,se debe preferir sqrt( x ) y cbrt( x ) a pow( x ,.5) o pow( x ,1./3).
- ↑ man cerf(3), man cerfc(3), véase, por ejemplo, https://linux.die.net/man/3/cerf .
- ↑ "La biblioteca GNU C – ISO Random" . Consultado el 18 de julio de 2018 .
- ↑ "Funciones matemáticas: la biblioteca C de LLVM" . libc.llvm.org .
- ↑ "RLibm: La biblioteca Libm correctamente redondeada del Laboratorio de Arquitectura y Lenguajes de Programación de Rutgers" . people.cs.rutgers.edu .
- ↑ Cordes, Peter. "intel - ¿Dónde está la función intrínseca '_mm256_pow_ps' de Clang?" . Stack Overflow .
Enlaces externos
- Declaraciones matemáticas – Referencia de definiciones básicas, Especificación UNIX única , versión 5 de The Open Group
- Referencia de C para funciones matemáticas
- Biblioteca estándar de C