Saltar al contenido

Escribe una función que tome (x, y) y devuelva x a la potencia de y SIN bucles

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 ejemplo 5 ⍵/⍺ 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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *