gpt4 book ai didi

c++ - #inf C++ Visual Studio

转载 作者:行者123 更新时间:2023-11-28 05:42:56 26 4
gpt4 key购买 nike

我在计算 double 的总和时遇到了问题。当我将迭代设置为 100000 时,函数 Asian_call_MC 仍然返回一个数字。但是,当我将迭代设置为大约 500000 及以上时,它开始返回 1.#INF。有人可以告诉我为什么会发生以及如何解决吗?我正在使用 Visual Studio 2013 编写 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;
}

最佳答案

当您增加迭代次数时,您会增加总和的值。在某些时候,该值会溢出 double 中可能包含的值,从而返回 1.#INF 值,该值代表您计算的无穷大。它这样做是因为计算出的值大于一对夫妇所能容纳的值。

要解决此问题,您需要将保存总和的变量更改为可以保存比 double 更大的数字的变量。起点是使用 long double

另一种选择是在 for 循环之后构建一些逻辑,这样您就可以处理较小的数字。如何执行此操作将因您要计算的字符串而异。

关于c++ - #inf C++ Visual Studio ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36782966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com