2014-10-29 1 views
-2

Вот вопрос, который, я надеюсь, улучшит мои программные отбивные. Я этот цикл, который вычисляет будущую сумму на основе ежегодных выплат, увеличение за счет процентов и обесценены инфляцией (это вытекает из функции PV в Excel):Рефактор a для цикла() с использованием Math.pow()?

var pmt = 66,449.75 // annual payment 
var ip = 0.03 // interest rate 
var fv = 0 // future value, not require here 
var k = 1 // interest is applied at beginning/end of period 
var n = 25 // number of periods (years in this case) 
var ri = 0.025 // rate of inflation 
var pv = 0;  
for (var i = n - 1; i >= 0; i -= 1) { 
    pv = (pv + (pmt * k - fv) * Math.pow(1 + ri, i))/(1 + ip); 
} 

Можно ли использовать Math.pow() воспроизвести, что делает этот цикл?

+3

Вы воссоздание клипа на каждой итерации, что вы хотите АРХИВ? – juvian

+4

что это делает? Я не компилятор, и ваше имя переменной не помогает делу –

+3

. Ваш вопрос нуждается в более подробной информации. Если это реализует конкретный математический подход или алгоритм, пожалуйста, добавьте информацию о том, какая из них (может быть совершенно другая, более эффективная реализация для достижения того же результата). Также убедитесь, что ваш код объясняет ваши переменные. Если это скопировать копию, приложите дополнительные усилия, чтобы переименовать переменные, чтобы мы могли понять, для чего они предназначены, или объяснить их в вашем сообщении. Без этого 'pmt',' k', 'fv',' ri' и 'ip' могут быть константами для всех, что мы знаем, и такие вещи, как' pmt * k-fv', не имеют смысла внутри цикла. –

ответ

0

Для упрощения, переименовать некоторые выражения

a = pmt * k - fv; 
b = 1 + ri; 
c = 1 + ip; 
x = pv; 

Так что ваш код становится

for (var i = n - 1; i >= 0; --i) { 
    x = x/c + a * Math.pow(b, i)/c; 
} 

Тогда

x_0 
x_1 = x_0/c + a b^{n-1}/c 
x_2 = x_1/c + a b^{n-2}/c = x_0/c^2 + a b^{n-1}/c^2 + a b^{n-2}/c 
... 
x_i = x_{i-1}/c + a b^{n-i}/c = x_0/c^i + \sum_{k=1}^i a b^{n-k}/c^{i-k+1} 
... 
x_n = x_0/c^n + \sum_{k=1}^n a * b^{n-k}/c^{n-k+1} 

Согласно WolframAlpha,

x_n = x_0/c^n + a (b^n-c^n)/(c^n (b-c)) 

Таким образом, вместо того, чтобы ваш цикл вы можете использовать

var foo = Math.pow(1 + ip, n); // c^n 
pv = pv/foo + (pmt*k-fv) * (Math.pow(1+ri,n) - foo)/foo/(ri-ip); 
+0

Спасибо, что пошли на это усилие! Однако использование этого кода не приводит к тому же результату, который был ранее у меня. Извинения, но, как указывали некоторые читатели, я не упоминал подробности, которые, возможно, были критическими, - которые я добавил выше. – stylecramper

+0

@stylecramper Я сделал ошибку, теперь исправлена. – Oriol

+0

Когда я сравниваю ваш против моего бок о бок, ваш код дает значение 125046905.28783791, а мое производит 184770003.67224348. – stylecramper