当sum_payoff = nan(ind)
很大时,它会返回M
。我不明白为什么,只有当int M = 50000;
double K = 32; // Strike price
double r = 0.05; // Interest Rate
double sigma = 0.2; // Underlying's volatility
double T = 5.0 / 12.0; // 5 Months Maturity
double sum_payoff(0.0);
for (int i(0); i < M; i++) {
double S_T = S*exp((r - pow(sigma, 2))*T + sigma * sqrt(T)*rand_normal());
sum_payoff += max(S_T - K, 0.0);
cout << sum_payoff << endl;
}
cout << "Sum payoff : " << sum_payoff << endl;
真的很大时才会这样。
rand_normal()
PS:public partial class Form1 : Form
{
string cmbRFR_item;
public Form1()
{
InitializeComponent();
}
private void change_cmbSubRFR_items()
{
cmbSubRFR.Items.Clear();//Clear all items in cmbSubRFR comboBox.
switch (cmbRFR_item)//Adding your new items to cmbSubRFR.
{
case "Null":
cmbSubRFR.Items.Add("Null/a blank item");
cmbSubRFR.Text = "Null/a blank item";
break;
case "POSITIONING":
cmbSubRFR.Items.Add("Anatomy cut-off");
cmbSubRFR.Items.Add("Rotation");
cmbSubRFR.Items.Add("Obstructed view");
cmbSubRFR.Items.Add("Tube or grid centering");
cmbSubRFR.Items.Add("Motion");
cmbSubRFR.Text = "";
break;
case "ARTEFACT":
cmbSubRFR.Items.Add("ARTEFACT");
cmbSubRFR.Text = "ARTEFACT";
break;
case "PATIENT ID":
cmbSubRFR.Items.Add("Incorrect Patient");
cmbSubRFR.Items.Add("Incorrect Study/Side");
cmbSubRFR.Items.Add("User Defined Error");
cmbSubRFR.Text = "";
break;
case "EXPOSURE ERROR":
cmbSubRFR.Items.Add("Under Exposure");
cmbSubRFR.Items.Add("Over Exposure");
cmbSubRFR.Items.Add("Exposure Malfunction");
cmbSubRFR.Text = "";
break;
case "TEST IMAGES":
cmbSubRFR.Items.Add("Quality Control");
cmbSubRFR.Items.Add("Service/Test");
cmbSubRFR.Text = "";
break;
}
}
private void cmbRFR_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbRFR_item!= cmbRFR.SelectedItem.ToString())//This will control your changes in cmbRFR about selected item and call change_cmbSubRFR_items()
{
cmbRFR_item = cmbRFR.SelectedItem.ToString();
change_cmbSubRFR_items();
}
}
}
按照标准正态定律N(0,1)返回一个随机数。
答案 0 :(得分:0)
您的计数器i
属于int
类型,如果M
大于此范围,则i
只能保留一定范围Datatypes ranges,{{1}没有意义,你可能会得到负值,这将使整个循环陷入混乱。
同样,当您指定一个大于数据类型范围的值时,它将被截断。 例如
int M = 99999999999;
std::cout<<M; // it won't be 99999999999
答案 1 :(得分:0)
假设
int M = 50000;
代表你对一个大数字的定义,我会说你在rand_normal中有一个错误,或者没有使用你期望的max(),或者没有初始化S而你的编译器没有将它默认为零。
如果rand_normal()是正确的并且S是有效值,则sum_payoff应该比你的代码高出50000 * S大约10%。
推理:除了rand_normal()之外,exp(...)中的所有项都是常量,将循环中的赋值行减少到
double S_T = S*exp(0.004166 + 0.129099*rand_normal());
这给出了0.004166到0.133265的输入范围,相应的exp()输出范围是1.004175到1.142553。由于S不被循环修改,因此无论S是什么(假设它> 0),结果平均比50000 * S高约10%。
检查以确认它是否正在调用您希望调用的max()函数;在不同的命名空间中可能有多个max()定义,具体取决于您用于构建它的内容。如果调用了错误的max(),结果可能无法预测。
检查rand_normal的定义,因为如果你关闭了浮点异常(或者使用的编译器没有关闭),那么意外的结果(如存储为nan(ind)的除零错误)可能会进行计算。支持他们。)
如果这些都不是问题,请仔细检查S的定义(无论数据类型是什么)并确保它正确初始化并且50000 * S不足以溢出双数据类型。