Программа не выводит правильный процент P
Задача: Под какой процент p выдана ссуда величиной S рублей, которая гасится месячными выплатами величиной m в течение n лет. На вход задачи получаем S,m,n.
Вопрос и моё решение: Программа в целом ничего не выводит при попытке сравнения m и copy. При попытке решения для S = 1000000, m = 14749, n = 10 , вместо 12, программа ничего не выводит. Подскажите, в чём ошибка или предложите альтернативное решение задачки.
Моё решение:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double S, m, n;
double r, copy;
double p;
cin >> S >> m >> n;
for (int i = 1; i <= 100; i ++){
p = i;
r = p/100;
copy = (n * r * pow((1 + r), n)) / (12 * (pow(1 + r, n) - 1));
if (copy == m){
cout << p;
}
}
}
Ответы (2 шт):
Вся проблема в точности вычислений. На 12 шаге в copy получается 14748.7, а не ваше 14749. Выхода три:
- Округлять при сравнении
if(round(copy) == m){
cout << p;
break;
};
- Сравнивать с пометкой на ошибку (aka epsilon). epsilon вам нужно будет подобрать самим, в зависимости от необходимой точности.
if(abs(copy-m) < epsilon){
cout << p;
break;
};
- Решать аналитически, а не итеративно, хотя, надо сказать, и тут тоже будут погрешности.
P.S.
спасибо Harry: вместо (S * r * pow((1 + r), n)) у вас почему-то (n * r * pow((1 + r), n))
Тут можно получить более точное значение r одним из численных методов, например, простых итераций:
double S = 1000000, m = 14749, n = 10;
double r = 0.5, old = 0, epsilon = 1e-8; // Точность ваычисления
for(;abs(r - old) > epsilon;)
{
old = r;
r = 12*m/S*(1 - 1/pow(1+old,n));
}
cout << r*100 << endl;
