当M很大时返回nan(ind)

时间:2016-02-24 19:56:00

标签: c++

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)返回一个随机数。

2 个答案:

答案 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不足以溢出双数据类型。