stringtranslate.com

funciones matemáticas C

Las operaciones matemáticas de 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 encabezados diferentes (los encabezados de 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 <math.h>( <cmath>encabezado en C++). Las funciones que operan con números enteros, como abs, labs, divy ldiv, se definen en cambio en el <stdlib.h>encabezado ( <cstdlib>encabezado en C++).

Cualquier función que opere con ángulos utiliza 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 solo aceptan tipos doublepara los argumentos de punto flotante, lo que genera costosas conversiones de tipos en códigos que de otro modo usarían floatvalores de precisión simple. En C99, esta deficiencia se solucionó mediante la introducción de nuevos conjuntos de funciones que funcionan con floatargumentos long double. Esas funciones se identifican con fy lsufijos respectivamente. [3]

Entorno de punto flotante

C99 agrega varias funciones y tipos para un control detallado del entorno de punto flotante. [3] Estas funciones se pueden utilizar 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 vuelven a cero, etc. El entorno de punto flotante funciona y Los tipos se definen en <fenv.h>el encabezado ( <cfenv>en C++ ).

Números complejos

C99 agrega una nueva _Complexpalabra clave (y complexuna 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 complexy 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 forma compatible con el código; 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, un sufijo fo ldenota la variante float complexo long double complexde la función.

Algunas funciones más complejas están "reservadas para uso futuro en C99". [5] Las implementaciones las proporcionan 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 de tipo genérico 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 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 definida tanto para números reales como complejos encapsula un total de 6 funciones diferentes: float, doubley long double, y sus complexvariantes. Las macros de tipo genérico que corresponden a una función definida solo para números reales encapsulan un total de 3 funciones diferentes: floaty doublevariantes long doublede 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 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 de números estadísticamente 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 flujo 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 usan el mismo nombre.

La calidad de la aleatoriedad randsuele ser demasiado débil para ser considerada estadísticamente aleatoria y requiere una siembra explícita. Por lo general, se recomienda utilizar arc4randomen lugar de randcuando sea posible. Algunas bibliotecas C implementan randel uso arc4random_uniforminternamente.

Implementaciones

En sistemas POSIX como Linux y BSD , las funciones matemáticas (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 la directiva al vinculador . Hay varias implementaciones, que incluyen:libm-lmlibm

Las implementaciones no necesariamente bajo el nombre de libmincluyen:

Ver también

Referencias

  1. ^ ab Especificación ISO/IEC 9899:1999 (PDF) . pag. 212, § 7.12.
  2. ^ Prata, Stephen (2004). Imprimación C plus . Editorial Sams. Apéndice B, Sección V: Biblioteca estándar ANSI C con adiciones C99. ISBN 0-672-32696-5.
  3. ^ ab Prata, Stephen (2004). Imprimación C plus . Editorial Sams. Apéndice B, Sección VIII: Mejoras computacionales numéricas C99. ISBN 0-672-32696-5.
  4. ^ Notacionalmente, puede parecer conveniente utilizar pow( x ,2) o pow( x ,3) para calcular cuadrados o cubos. Sin embargo, esto no es aconsejable en código en el que el tiempo es crítico. A menos que una implementación tenga especial cuidado en estos casos en el momento de la compilación, x * x o x * x * x se ejecutarán mucho más rápido. Además, se deben preferir sqrt( x ) y cbrt( x ) a pow( x ,.5) o pow( x ,1./3).
  5. ^ man cerf(3), man cerfc(3), consulte, por ejemplo, https://linux.die.net/man/3/cerf.
  6. ^ "La biblioteca GNU C - ISO aleatorio" . Consultado el 18 de julio de 2018 .
  7. ^ Cordés, Pedro. "intel - ¿Dónde está intrínseco el '_mm256_pow_ps' de Clang?". Desbordamiento de pila .

enlaces externos