Exponentes en C
-
Usar
pow
como función de exponenciación en C - Usar una función definida por el usuario para la exponenciación de enteros en C
Este artículo demostrará múltiples métodos sobre cómo utilizar las funciones de exponenciación en C.
Usar pow
como función de exponenciación en C
La función pow
es parte de la biblioteca matemática de C y está definida en la cabecera <math.h>
. La librería matemática debe ser enlazada explícitamente cuando se utiliza la cadena de herramientas del compilador gcc
. Debe pasar la bandera lm
al compilar o incluirla en el archivo del sistema de compilación correspondiente según sea necesario. La librería pow
está definida sólo para números de punto flotante; por lo tanto, no debe utilizarse con números enteros para obtener resultados óptimos.
En el siguiente código de ejemplo, demostramos cómo calcular el enésimo exponente de una única variable double
. pow
toma dos parámetros - un número base para exponer y el exponente mismo. Podemos encadenar el resultado de la función pow
en la llamada printf
ya que devuelve el número calculado. Sin embargo, hay múltiples errores a tener en cuenta para entradas específicas, y todos ellos están documentados en esta página.
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
double x = 10.0;
printf("x: %f\n", x);
printf("x^2: %f\n", pow(x, 2));
exit(EXIT_SUCCESS);
}
Producción :
x: 10.000000
x^2: 100.000000
Usar una función definida por el usuario para la exponenciación de enteros en C
Alternativamente, podemos definir nuestra función personalizada para calcular la exponenciación para números integrales. Al principio, implementamos la función para valores int
. La implementación es bastante sencilla; la iteración con el bucle for
multiplica el entero base por sí mismo n
veces. La función devuelve el valor int
calculado. Observe que no comprueba el desbordamiento del tipo entero, y el usuario debe ser consciente de este hecho cuando utilice esta función.
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int exponentInt(const int base, int n) {
int i, p = base;
for (i = 1; i < n; ++i) p *= base;
return p;
}
int main() {
int x2 = 10;
printf("x2: %d\n", x2);
printf("x2^4: %d\n", exponentInt(x2, 4));
exit(EXIT_SUCCESS);
}
Producción :
x2: 10
x2^4: 10000
La implementación anterior de la función de exponenciación está limitada porque sólo puede llegar hasta 232-1 para los números calculados, ya que el tipo int
está limitado con el espacio de almacenamiento de 32 bits. Podemos ampliar este límite con el tipo unsigned long
, que tiene un espacio de 64 bits en los sistemas correspondientes. Así, el valor calculado de la función de exponenciación puede llegar a 264-1. Tenga en cuenta que esta función se desbordará a partir de cierto punto, como se demuestra en el siguiente ejemplo.
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
unsigned long exponentInteger(const unsigned long base, unsigned n) {
unsigned long i, p = base;
for (i = 1; i < n; ++i) p *= base;
return p;
}
int main() {
int x2 = 10;
printf("x2: %d\n", x2);
printf("x2^19: %lu\n", exponentInteger(x2, 19));
printf("x2^20: %lu\n", exponentInteger(x2, 20));
exit(EXIT_SUCCESS);
}
Producción :
x2: 10
x2^19: 10000000000000000000
x2^20: 7766279631452241920
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook