2010-03-16 24 views
1

J'essaie d'obtenir cette expression pour fonctionner, je suis assez sûr que ce n'est pas la parenthèse parce que je les ai comptés tous. Peut-être y at-il quelque chose que je fais mal impliquant le paramètre pow (x, y).C++ Question sur la fonction pow

double calculatePeriodicPayment() 
{ 
periodicPaymentcalc = (loan * ((interestRate/yearlyPayment)))/(1-((pow ((1+(interestRate/yearlyPayment)))),(-(yearlyPayment * numOfYearLoan)))); 

return periodicPaymentcalc; 
} 
+12

Peut-être serait-il plus lisible si vous divisiez le calcul en étapes plus petites? –

+1

S'il vous plaît fournir l'erreur/mauvaise conduite que vous obtenez. –

+1

En quoi cela ne fonctionne-t-il pas? Compiler l'erreur? Mauvais résultat à l'exécution? Erreur d'exécution? Si c'est une erreur, postez l'erreur. En outre, nous pouvons avoir besoin de connaître les types de toutes ces variables. –

Répondre

9

Notez combien il est plus facile de comprendre ce que la fonction fait si vous divisez chaque étape en plusieurs parties: (Je trouve encore plus facile si vos variables correspondent au matériel source, donc je nommerai mes variables après ceux que Wikipedia utilise.)

// amortization calculator 
// uses annuity formula (http://en.wikipedia.org/wiki/Amortization_calculator) 
// A = (P x i)/(1 - pow(1 + i,-n)) 
// Where: 
// A = periodic payment amount 
// P = amount of principal 
// i = periodic interest rate 
// n = total number of payments 
double calculatePeriodicPayment() 
{ 
    const double P = loan; 
    const double i = interestRate/yearlyPayment; 
    const double n = yearlyPayment * numOfYearLoan; 

    const double A = (P * i)/(1 - pow(1.0 + i, -n)); 

    return A; 
} 

Il est beaucoup plus facile de confirmer que la logique de cette fonction fait ce qu'elle devrait faire.

Si vous êtes curieux, en remplaçant mes noms de variables, votre problème de parenthises se présente comme suit:

const double A = (P * i)/(1 - pow(1 + i)), -n; // <- this is how you have it 
    const double A = (P * i)/(1 - pow(1 + i, -n)); // <- this is how it should be 

Avec ce groupe, vous êtes que passer un argument à pow, ce qui explique pourquoi le compilateur dit no overloaded function takes 1 arguments. Edit: Vous avez mentionné que j'ai utilisé plus de variables. Cependant, votre compilateur utilisera des variables temporaires comme je l'ai fait. Votre déclaration complexe sera divisé en morceaux, et peut ressembler à ceci:

double calculatePeriodicPayment() 
{ 
    const double temp1 = interestRate/yearlyPayment; 
    const double temp2 = loan * temp1; 
    const double temp3 = interestRate/yearlyPayment; 
    const double temp4 = 1.0 + temp3; 
    const double temp5 = yearlyPayment * numOfYearLoan; 
    const double temp6 = -temp5; 
    const double temp7 = pow(temp4, temp5); 
    const double temp8 = 1 - temp7; 
    const double temp9 = temp2/temp8; 

    periodicPaymentcalc = temp9; 
    return periodicPaymentcalc; 
} 

mine sera également brisé, et ressemblera à ceci:

double calculatePeriodicPayment() 
{ 
    const double P = loan; 
    const double i = interestRate/yearlyPayment; 
    const double n = yearlyPayment * numOfYearLoan; 

    const double temp1 = P * i; 
    const double temp2 = 1.0 + i; 
    const double temp3 = -n; 
    const double temp4 = pow(temp2, temp3); 
    const double temp5 = 1 - temp4; 
    const double temp6 = temp1/temp5; 
    const double A = temp6; 

    return A; 
} 

Peut-être il y a quelques optimisations que les Le compilateur utilisera, par exemple en notant qu'il utilise interestRate/yearlyPayment deux fois dans votre fonction, et utilise le même temporaire pour les deux endroits, mais il n'y a pas de garantie que cela arrivera. Notez que nous utilisons à peu près le même nombre de variables dans nos deux fonctions. Je viens d'utiliser plus de variables nommées, et moins de temporaires sans nom.

+1

+1: bonne réponse, avec de bons conseils sur la façon d'écrire le code lisible –

+0

Merci beaucoup. Je ne pouvais pas le faire fonctionner sur une seule ligne, donc j'ai séparé en étapes plus petites, mais avec plus de variables. – Sagistic

+0

@Sagistic: Content de pouvoir aider! Il est important de réaliser que je n'utilise pas plus de variables que vous. Les vôtres n'étaient que des variables sans nom utilisées par le compilateur pour comparer les résultats de l'ordinateur. Je vais éditer mon post pour élaborer. – Bill

2

Il y a un support mal placé. Voici une version fixe:

periodicPaymentcalc = (loan * ((interestRate/yearlyPayment)))/(1 - ((pow ((1+(interestRate/yearlyPayment)),(-(yearlyPayment * numOfYearLoan)))))); 

Utilisez un éditeur qui met en valeur les supports correspondant pour éviter ce genre d'erreurs. Ou créez simplement des variables temporaires pour contenir des valeurs intermédiaires.

+0

Toujours la même erreur – Sagistic

+0

Ou d'écrire le calcul en utilisant plus d'une ligne de code, dans le cas où les variables temporaires ne sont pas une option pour une raison quelconque. – Brian

+0

Je suppose, je vais juste devoir utiliser les valeurs de température et de le simplifier – Sagistic

1
periodicPaymentcalc = (loan * interestRate/yearlyPayment)/
    (1.0 - pow (1.0 + interestRate/yearlyPayment, -yearlyPayment * numOfYearLoan)); 

Essayez-le. J'ai également supprimé toutes les parenthèses redondantes, ainsi que tous les littéraux en double, juste pour faire bonne mesure.