Я столкнулся с вопросом при вычислении суммы двойного. Когда я устанавливаю итерацию на 100000, функция Asian_call_MC все равно возвращает число. Однако, когда я устанавливаю итерацию около 500000 и выше, она начинает возвращать 1. # INF. Может ли кто-нибудь сказать мне, почему это происходит и как его решить? Я использую visual studio 2013 для написания кода на C++.#inf C++ visual studio
double Avg_Price(double init_p, double impl_vol, double drift, int step, double deltasqrt)
{
//Calculate the average price of one sample path
//delta = T/ step
//drift = (risk_free - div_y - impl_vol*impl_vol/2)*(T/step)
double Sa = 0.0;
double St = init_p;
for (int i = 0; i < step; i++)
{
St = St*exp(drift + impl_vol*deltasqrt*normal_gen());
//Sa = Sa * i/(i + 1) + St/(i + 1);
Sa += St;
}
Sa = Sa/double(step);
return Sa;
}
double Asian_call_MC(double strike_p, double T, double init_p, double impl_vol, double risk_free, double div_y, int iter, int step)
{
//Calculate constants in advance to reduce computation time
double drift = (risk_free - div_y - impl_vol*impl_vol/2)*double(T/step);
double deltasqrt = sqrt(double(T/step));
//Generate x1, average x and y
double cur_p = Avg_Price(init_p,impl_vol,drift,step,deltasqrt);
double pay_o=0.0;
double x = max(cur_p - strike_p,0.0);
//double y = pow(x, 2.0);
//Generate x2 to xn
for (int i = 0; i < iter; i++)
{
cur_p = Avg_Price(init_p, impl_vol, drift, step, deltasqrt);
x = max(cur_p - strike_p,0.0);
//double q = double(i)/double(i + 1);
//pay_o = pay_o *i/(i+1) + x/(i + 1);
pay_o += x;
//y = (1 - (1/(i + 1)))*y + x*x/(i + 1);
}
//pay_o = pay_o/double(iter);
//stdev = sqrt((y - pow(pay_o , 2))/(iter - 1));
//return pay_o*exp(-risk_free*T) ;
return pay_o;
}
Что возвращает 'normal_gen'? Какой у вас номер с 100000 итерациями? – 1201ProgramAlarm
normal_gen генерирует нормально распределенное число со средним значением 0 и дисперсией 1. Сумма составляет около 800000, когда я устанавливаю итерацию на 100000. – zhnzhang61
Таким образом, она может возвращать «большое» число, а затем и не ограничена. В какой-то момент одна из ваших итераций получает там достаточно большое значение, которое в сочетании со значениями для дрейфа, impl_vol и deltasqrt приводит к переполнению (любое значение около 710). – 1201ProgramAlarm