Pregunta

Estoy intentando conseguir esta expresión para el trabajo, estoy bastante seguro de que no es el paréntesis porque conté todos ellos. Tal vez hay algo que estoy haciendo mal que implica el parámetro pow (x, y).

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

 return periodicPaymentcalc;
}
¿Fue útil?

Solución

Tenga en cuenta lo fácil que es averiguar cuál es la función que está haciendo si se rompe cada paso en pedazos: (Me resulta aún más fácil si las variables coinciden con el material de origen, así que voy a nombrar a mi variables después los utiliza Wikipedia.)

// 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; 
} 

Es mucho más fácil de confirmar que la lógica de esta función hace lo que debe de esta manera.

Si tienes curiosidad, sustituyendo mis nombres de variables en, su problema parenthises es el siguiente:

  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

Con esta agrupación, que sólo está pasando un argumento a pow, por lo que el compilador dice no overloaded function takes 1 arguments.

Editar: Usted mencionó utilicé más variables. Sin embargo, el compilador utilizará variables temporales al igual que yo. Su estado de complejo se divide en pedazos, y puede ser algo como esto:

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; 
} 

El mío también se romperá, y se verá así:

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; 
} 

Tal vez hay algunas optimizaciones que va a utilizar el compilador, como notar que utiliza interestRate / yearlyPayment dos veces en su función, y utilizan el mismo temporal para ambos lugares, pero no hay gurantee esto sucederá. Nótese que usamos más o menos el mismo número de variables, tanto de nuestras funciones. Acabo de utilizar más variables con nombre y sin nombre menos temporales.

Otros consejos

Hay un soporte fuera de lugar. Aquí hay una versión fija:

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

Utilice un editor que destaca a juego soportes para evitar este tipo de errores. O simplemente crear variables temporales para mantener valores intermedios.

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

Trate de eso. He quitado todo el paréntesis redundantes también, así como el cambio de todos los literales a dobles, sólo por si acaso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top