El paso a paso o código que verás en este artículo es la solución más eficiente y válida que encontramos a esta inquietud o dilema.
Solución:
APL (7)
×/⍵/⍺
El argumento de la izquierda es la base, el argumento de la derecha es el exponente, por ejemplo:
5 ×/⍵/⍺ 6
15625
Explicación:
⍵/⍺
replica⍺
⍵
veces, por ejemplo5 ⍵/⍺ 6
->5 5 5 5 5 5
×/
toma el producto, por ejemplo×/5 5 5 5 5 5
->5×5×5×5×5×5
->15625
C#: exponentes de coma flotante
OK, esta solución es bastante frágil. Puedes romperlo fácilmente lanzando números ridículamente grandes como 6. Pero funciona maravillosamente para cosas como DoublePower(1.5, 3.4)
y no usa recursividad!
static double IntPower(double x, int y)
return Enumerable.Repeat(x, y).Aggregate((product, next) => product * next);
static double Factorial(int x)
return Enumerable.Range(1, x).Aggregate(1.0, (factorial, next) => factorial * next);
static double Exp(double x)
return Enumerable.Range(1, 100).
Aggregate(1.0, (sum, next) => sum + IntPower(x, next) / Factorial(next));
static double Log(double x)
if (x > -1.0 && x < 1.0)
return Enumerable.Range(1, 100).
Aggregate(0.0, (sum, next) =>
sum + ((next % 2 == 0 ? -1.0 : 1.0) / next * IntPower(x - 1.0, next)));
else
return Enumerable.Range(1, 100).
Aggregate(0.0, (sum, next) =>
sum + 1.0 / next * IntPower((x - 1) / x, next));
static double DoublePower(double x, double y)
return Exp(y * Log(x));
C++
¿Qué tal un poco de metaprogramación de plantilla? Dobla las pequeñas reglas que había, pero vale la pena intentarlo:
#include
template
class tmp_pow
public:
constexpr tmp_pow(float base) :
value(base * tmp_pow(base).value)
const float value;
;
template <>
class tmp_pow<0>
public:
constexpr tmp_pow(float base) :
value(1)
const float value;
;
int main(void)
tmp_pow<5> power_thirst(2.0f);
std::cout << power_thirst.value << std::endl;
return 0;
Agradecemos que desees favorecer nuestra publicación dejando un comentario y dejando una puntuación te estamos eternamente agradecidos.
¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4.5)