Tabla de fichas Indice del Tema 0305
0301 0302 0303 0304 0305 0306 0307 0308

FUNCIONES ARITMÉTICAS DE USO FRECUENTE.






Tabla de funciones aritméticas
El archivo de encabezado math.h contiene una notable cantidad de funciones aritméticas que complementan las capacidades iniciales del lenguaje. Es conveniente incluir también el encabezado errno.h, que proporciona valores asociados a diferentes errores de coma flotante, a través de la variable global errno (número de error). Véase a continuación una lista de funciones cuya definición consta en math.h.


Prototipo de la función Comentarios
double acos(double x)  Función arco coseno. Si no es -1 <= x <= 1, acos() da a errno el valor EDOM (error de dominio).
 double asin(double x) Función arco seno. Análoga a acos().
 double atan(double x) Función arco tangente. Proporciona un valor perteneciente al intervalo [-π/2, π/2]. Análoga a acos().
double atan2(double x, double y)  Función arco tangente. Proporciona el arco tangente de y/x, teniendo en cuenta el signo de x y el de y. El valor resultante pertenece al intervalo [-π, π].
 double ceil(double r) Proporciona el menor entero no menor que r.
 double sin(double x) Proporciona el seno de x; x estará medido en radianes.
 double cos(double x) Proporciona el coseno de x; x estará medido en radianes.
 double cosh(double x) Proporciona el coseno hiperbólico de x.
 double exp(double x) Proporciona el valor de e elevado a x.
 double fabs(double x) Proporciona el valor absoluto de x.
 double floor(double r) Calcula el mayor entero que no es mayor que r.
double fmod(double x, double y) Proporciona el resto (en coma flotante) que se obtiene al dividir x por y. El signo del resto coincide con el signo del numerador, x.
double frexp(double valor, int * exp) Extrae la mantisa y el exponente de valor; la mantisa se proporciona como valor de la función y el exponente se almacena en el entero cuyo puntero se suministra como segundo argumento. La fórmula empleada es valor = mantisa * 2 elevado a exp.
 double ldexp(double x, int exp);   Calcula el valor representado mediante la mantisa x y el exponente exp que se le proporcionan, empleando la misma fórmula que frexp()
 double log(double x)
double log10(double x)
Proporcionan el logaritmo neperiano y el logaritmo en base diez, respectivamente, del valor x proporcionado como argumento. Si es x < 0 entonces las dos funciones dan a errno el valor EDOM.
 double modf(double valor, double *ptroparteentera);  Separa la parte entera y la parte fraccionaria de valor. La parte entera se devuelve como valor de la función, y la parte fraccionaria se almacena en el puntero de double que se pasa como segundo argumento.
 double pow(double x, double y)  Calcula x elevado a y. Esta función da a errno el valor EDOM en el caso de que x sea cero e y sea menor o igual que cero, o bien cuando x es negativo e y no es entero.
 double sinh(double x)  Calcula el seno hiperbólico de x.
 double sqrt(double x)  Calcula la raíz cuadrada de x.
 double tan(double x) Calcula la tangente de x.
 double tanh(double x)  Calcula la tangente hiperbólica de x.


La similitud de estas funciones en C con sus contrapartidas matemáticas hace sencilla su comprensión. En todo caso, véase un Ejemplo.

Operadores de (pre, post) (incremento, decremento).
Es muy frecuente que sea necesario incrementar o decrementar una cierta variable en una unidad. Un posible código para hacer esto sería x = x + 1; y = y - 1; C ofrece dos operadores unarios, ++ y --, que realizan precisamente esta función. El código equivalente empleando estos operadores sería x++; y--; Los operadores ++ y -- dan lugar a un código más eficiente que el equivalente funcional mencionado en primer lugar. Adicionalmente, si el operador precede al operando, entonces el compilador incrementa o decrementa primero el operando, y después lo utiliza. Sin el operando precede al operador, entonces el compilador utiliza primero el operando y después lo incrementa o decrementa. Esto resulta útil en algunas sentencias de control. Para comprender mejor el funcionamiento de estos operadores, conviene estudiar el Ejemplo que se ha resuelto.

Ejemplo.- Construir un programa que muestre el funcionamiento de las distintas funciones matemáticas que ofrece el archivo de encabezado math.h.
/*Este programa muestra ejemplos de las funciones aritéticas contenidas en math.h
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(void)
{
/*	Utilización de las funciones trigonométricas inversas	*/
double x = 0.5, y = -1.0;
double m, valor = 12.0;
int e;
printf("Funciones trigonométricas inversas.\n\n");
printf("arccos (%f) = %f\n", x, acos(x));
printf("arcsin (%f) = %f\n", x, asin(x));
printf("arctan (%f) = %f\n", x, atan(x));
printf("arctan (%f / %f) = %f\n", y, x,atan2(y, x));
/*	Utilización de ceiling() y floor()	*/
printf("\nCálculo del mayor entero menor y del menor entero mayor.\n\n");
x = 100.001, y = 9.99;
printf("El menor entero mayor que %f es %f.\n", x,ceil(x));
printf("El menor entero que %f es %f.\n", y,ceil(y));x = 12.03, y = 10.999;
printf("El mayor entero menor que %f es %f.\n", x,floor(x));
printf("El mayor entero menor que %f es %f.\n", y,floor(y));
/*	Utilización de funciones trigonométricas e hiperbólicas directas	*/
x = 0.0;
printf("\nFunciones trigonométricas.\n\n");
printf("El seno de %f is %f.\n", x, sin(x));
printf("El seno hiperbólico de %f es %f.\n",x,sinh(x));
x = 0.0;
printf("El coseno de %f es %f.\n", x, cos(x));
printf("El coseno hiperbólico de %f es %f.\n",x,cosh(x));
x = 0.0;
printf("La tangente de %f es %f.\n", x, tan(x));
printf("La tangente hiperbólica de %f es %f.\n",x,tanh(x));
/*	Utilización de funciones exponenciales y logarítmicas.	*/
x = 4.0;
printf("\nFunciones exponenciales y logarítmicas.\n\n");
printf("La base de los logaritmos naturales, e, elevado a\n");
printf("la potencia %f es %f.\n", x, exp(x));x = 100.0;
printf("El logaritmo natural de %f es %f\n",x, log(x));
printf("El logaritmo en base 10 de %f es %f\n",x, log10(x));
/*
Utilización de funciones de extracción
e inserción	de mantisa y exponente.
*/
printf("\nFunciones de mantisa y exponente.\n\n");m = frexp(valor, &e);
printf("%f = %f * 2 elevado a la potencia %d.\n", valor, m, e);
valor, x = 0.75;
e = 4;
valor = ldexp(x, e);
printf("%f * 2 elevado a la potencia %d es %f.\n",x, e, valor);
/*	Utilización de la función de potencia.	*/
printf("\nFunción de potencia.\n\n");
printf("Potencias de 2:\n");for (x = 1.0; x <= 10.0; x += 1.0)
printf("2 elevado a %4.0f es %4.0f.\n", x, pow(2, x));
printf("\n\nTerminación normal del programa.\n\n");
return 0;
}

/*Resultados del programa.

Funciones trigonométricas inversas.

arccos (0.500000) = 1.047198
arcsin (0.500000) = 0.523599
arctan (0.500000) = 0.463648
arctan (-1.000000 / 0.500000) = -1.107149

Cálculo del mayor entero menor y del menor entero mayor.

El menor entero mayor que 100.001000 es 101.000000.
El menor entero que 9.990000 es 10.000000.
El mayor entero menor que 12.030000 es 12.000000.
El mayor entero menor que 10.999000 es 10.000000.

Funciones trigonométricas.

El seno de 0.000000 is 0.000000.
El seno hiperbólico de 0.000000 es 0.000000.
El coseno de 0.000000 es 1.000000.
El coseno hiperbólico de 0.000000 es 1.000000.
La tangente de 0.000000 es 0.000000.
La tangente hiperbólica de 0.000000 es 0.000000.

Funciones exponenciales y logarítmicas.

La base de los logaritmos naturales, e, elevado a
la potencia 4.000000 es 54.598150.
El logaritmo natural de 100.000000 es 4.605170
El logaritmo en base 10 de 100.000000 es 2.000000

Funciones de mantisa y exponente.

12.000000 = 0.750000 * 2 elevado a la potencia 4.
0.750000 * 2 elevado a la potencia 4 es 12.000000.

Función de potencia.

Potencias de 2:
2 elevado a    1 es    2.
2 elevado a    2 es    4.
2 elevado a    3 es    8.
2 elevado a    4 es   16.
2 elevado a    5 es   32.
2 elevado a    6 es   64.
2 elevado a    7 es  128.
2 elevado a    8 es  256.
2 elevado a    9 es  512.
2 elevado a   10 es 1024.


Terminación normal del programa.

*/


Ejercicios propuestos

  1. Ejercicio 0305r01.-Se dispone de una lista de ecuaciones de segundo grado, cuyos coeficientes están almacenados en un archivo de texto. Se pide construir un programa que admita y/o solicite el nombre del archivo de texto y construya otro que contendrá las soluciones de las ecuaciones.

  2. Ejercicio 0305r02.-La trayectoria de un móvil en medio no resistente es de la forma y = a*x^2 + b*x +c, en donde los coeficientes de la ecuación tienen los valores siguientes: a = b = c = Se dispone de un rifle cuya velocidad de salida es de 900 m/s. Sabiendo que la constante en la Tierra es g = 9.80 m/s^2, se pide muestrear regularmente esta trayectoria desde el lanzamiento hasta el impacto con el suelo, para un ángulo de lanzamiento de 45º. ¿Qué sucedería en la Luna, sabiendo que la gravedad lunar es seis veces menor que la terrestre?

  3. Ejercicio 0305r03.-Se necesita desarrollar en serie de Fourier una función en escalón. Construir un programa que admita el número de términos deseados a través de la línea de órdenes, almacenando en disco un muestreo de la serie resultante.

  4. Ejercicio 0305r04.-Se dispone de un polinomio del cual se quieren calcular las raíces. Se ha determinado por métodos gráficos un intervalo que contiene una raíz. Se pide construir un programa que permita calcular la raíz empleando el método de bisección./li>
  5. Ejercicio 0305r05.-Se desea comprobar las distinas precisiones obtenidas al realizar una integración numérica empleando el método de Euler (rectangular) y el método trapezoidal. Aplicar ambos métodos para calcular la integral de la función seno entre 0 y π. El programa deberá recibir el número de subintervalos a través de la línea de órdenes.

  6. Ejercicio 0305r06.-Se dispone de una lista de números float positivos y negativos. Se pide construir un programa que calcule la suma de los elementos de la lista, primero por el procedimiento habitual y después sumando primero los números positivos y luego los negativos por separado.

  7. Ejercicio 0305r07.-Considérese la función compleja f(z) = 1 + z^2. Se pide construir un programa que admita un número complejo y proporcione un resultado entero, que será el número de veces que es preciso aplicar sucesivamente f(z) para obtener un número de módulo menor que cierto epsilon, esto es, |f(f(f(...f(z))))| < epsilon.

  8. Ejercicio 0305r08.-Construir un programa que verifique el funcionamiento de los operadores ++ y --.