2010-12-13 5 views
1

Je dois écrire un algorithme qui exponentie une base (entier ou flottant) dans un argument entier ou flottant. J'ai écrit cet algorithme pour Déluge (zoho.com), mais il ne peut utiliser que des exposants entiers:Algorithme d'exponentiation d'exposant flottant

float math.potencia(float base, int expoente) 
{ 
    if(expoente>0) 
    { 
    base = base * thisapp.math.potencia(base, (input.expoente - 1)); 
    } 
    else if (expoente == 0) 
    { 
    base = 1; 
    } 
    return base; 
} 

(Déluge ne dispose pas d'un opérateur de potentialisation ou la fonction). Merci!

Répondre

1

Eh bien, plus de 17 heures sans réponse, enfin je l'ai trouvé une réponse à ma propre question:

En nous pouvons façon, plus simple de résoudre le problème en utilisant la valeur de « e » à la exponentiation logarithme du nombre divisé par l'indice:

e^(Log (nombre)/index)

où numéro est le radicande et l'indice est la racine souhaitée.

Exemples: Le 10ème racine du nombre 1024: e^(Log (1024)/10) = 2.

PS: la base de la fonction logarithmique est également "e". la valeur arrondie pour "e" est: 2.718281828459045

J'espère que cette technique peut être utile pour vous.

+0

Vous n'avez pas reçu une réponse parce que votre question a été mal étiqueté. – skaffman

+0

Je voudrais si vous me sugest un autre tags. Pour mon score, je ne dois pas en créer de nouveaux. – Alex

3

Supposons que vous pouvez utiliser sqrt, vous pouvez utiliser l'algorithme suivant:

double EPS = 0.0001; 

double exponentiation(double base, double exp){ 
    if(exp >= 1){ 
    double temp = exponentiation(base, exp/2); 
    return temp * temp; 
    } else{ 
    double low = 0; 
    double high = 1.0; 

    double sqr = sqrt(base); 
    double acc = sqr;  
    double mid = high/2; 

    while(abs(mid - exp) > EPS){ 
     sqr = sqrt(sqr); 

     if (mid <= exp) { 
      low = mid; 
      acc *= sqr; 
     } else{ 
      high = mid; 
      acc *= (1/sqr); 
     } 

     mid = (low + high)/2; 
    } 

    return acc; 
    } 
}