私は二重の合計を計算する際に質問に出くわしました。繰り返しを100000に設定すると、関数Asian_call_MCはまだ数値を返します。しかし、反復を約500000以上に設定すると、1に戻ります。#INF。誰かがなぜそれが起こり、どうやって解決するのか教えてもらえますか?私はVisual Studio 2013を使用してC++コードを記述しています。#inf C++ビジュアルスタジオ
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の正規分布数を生成します。反復回数を100000に設定すると、合計は約800000になります。 – zhnzhang61
したがって、「大きい」数値を返して境界にはなりません。ある時点では、ドリフト、impl_vol、およびdeltasqrtの値と組み合わされたときにオーバーフロー(約710以上の値)が発生するほど大きな反復回数が発生します。 – 1201ProgramAlarm