internal bool goal_seek_bisection(ref GoalSeekData data, double[] vals) { int num3 = 0; if (data.havexpos && data.havexneg) { double num2 = Math.Abs((double)(data.xpos - data.xneg)) / (Math.Abs(data.xpos) + Math.Abs(data.xneg)); for (int i = 0; i < 160; i++) { double xneg; double xpos; double yneg; double num11; double y = 0.0; int num6 = 0; num6 = ((i % 4) == 0) ? 1 : (((i % 4) == 2) ? 2 : 3); Label_0068: switch (num6) { case 0: xneg = data.xpos - (data.ypos * ((data.xneg - data.xpos) / (data.yneg - data.ypos))); goto Label_0274; case 1: xneg = (data.xpos + data.xneg) / 2.0; if (!this.irr_npv(xneg, ref y, vals)) { continue; } if (y != 0.0) { break; } FinancialHelper.update_data(xneg, y, ref data); return(true); case 2: yneg = 0.0; num11 = 0.0; if (num2 <= 0.1) { goto Label_017F; } num6 = 3; goto Label_0068; case 3: xneg = (data.xpos + data.xneg) / 2.0; goto Label_0274; default: return(false); } double num7 = Math.Sqrt((y * y) - (data.ypos * data.yneg)); if (num7 == 0.0) { continue; } xneg += ((xneg - data.xpos) * y) / num7; goto Label_0274; Label_017F: switch ((num3++ % 4)) { case 0: xpos = data.xpos; xpos = data.ypos; break; case 2: xpos = data.xneg; yneg = data.yneg; break; default: xpos = (data.xpos + data.xneg) / 2.0; if (!this.irr_npv(xpos, ref yneg, vals)) { continue; } break; } double xstep = Math.Abs((double)(data.xpos - data.xneg)) / 1000000.0; if (!this.fake_df(xpos, ref num11, xstep, ref data, vals) || (num11 == 0.0)) { continue; } xneg = xpos - ((1.01 * yneg) / num11); if (((xneg < data.xpos) && (xneg < data.xneg)) || ((xneg > data.xpos) && (xneg > data.xneg))) { continue; } Label_0274: if (this.irr_npv(xneg, ref y, vals)) { if (FinancialHelper.update_data(xneg, y, ref data)) { return(true); } num2 = Math.Abs((double)(data.xpos - data.xneg)) / (Math.Abs(data.xpos) + Math.Abs(data.xneg)); if (num2 < data.precision) { if (data.yneg < y) { y = data.yneg; } xneg = data.xneg; if (data.ypos < y) { y = data.ypos; } xneg = data.xpos; data.root = xneg; return(true); } } } } return(false); }
private bool goal_seek_bisection(ref GoalSeekData data, DateTime settle, DateTime maturity, double rate, double price, double redem, int freq, int basis) { int num3 = 0; if (data.havexpos && data.havexneg) { double num2 = Math.Abs((double)(data.xpos - data.xneg)) / (Math.Abs(data.xpos) + Math.Abs(data.xneg)); for (int i = 0; i < 0x6c; i++) { double xpos; double yneg; double num10; double num11; double yield = 0.0; double y = 0.0; int num6 = ((i % 4) == 0) ? 1 : (((i % 4) == 2) ? 2 : 3); Label_006F: switch (num6) { case 0: yield = data.xpos - (data.ypos * ((data.xneg - data.xpos) / (data.yneg - data.ypos))); goto Label_02B3; case 1: yield = (data.xpos + data.xneg) / 2.0; if (!yield_f(yield, ref y, settle, maturity, rate, price, redem, freq, basis)) { continue; } if (y != 0.0) { break; } FinancialHelper.update_data(yield, y, ref data); return(true); case 2: xpos = 0.0; yneg = 0.0; num10 = 0.0; num11 = 0.0; if (num2 <= 0.1) { goto Label_01A9; } num6 = 3; goto Label_006F; case 3: yield = (data.xpos + data.xneg) / 2.0; goto Label_02B3; default: goto Label_02B3; } double num7 = Math.Sqrt((y * y) - (data.ypos * data.yneg)); if (num7 == 0.0) { continue; } yield += ((yield - data.xpos) * y) / num7; goto Label_02B3; Label_01A9: switch ((num3++ % 4)) { case 0: xpos = data.xpos; xpos = data.ypos; break; case 2: xpos = data.xneg; yneg = data.yneg; break; default: xpos = (data.xpos + data.xneg) / 2.0; if (!yield_f(xpos, ref yneg, settle, maturity, rate, price, redem, freq, basis)) { continue; } break; } num10 = Math.Abs((double)(data.xpos - data.xneg)) / 1000000.0; if (!this.fake_df(xpos, ref num11, num10, ref data, settle, maturity, rate, price, redem, freq, basis) || (num11 == 0.0)) { continue; } yield = xpos - ((1.01 * yneg) / num11); if (((yield < data.xpos) && (yield < data.xneg)) || ((yield > data.xpos) && (yield > data.xneg))) { continue; } Label_02B3: if (yield_f(yield, ref y, settle, maturity, rate, price, redem, freq, basis)) { if (FinancialHelper.update_data(yield, y, ref data)) { return(true); } num2 = Math.Abs((double)(data.xpos - data.xneg)) / (Math.Abs(data.xpos) + Math.Abs(data.xneg)); if (num2 < data.precision) { if (data.yneg < y) { y = data.yneg; yield = data.xneg; } if (data.ypos < y) { y = data.ypos; yield = data.xpos; } data.root = yield; return(true); } } } } return(false); }
internal bool goal_seek_newton(ref GoalSeekData data, DateTime settle, DateTime maturity, double rate, double price, double redem, int freq, int basis, double x0) { double num2 = data.precision / 2.0; for (int i = 0; i < 20; i++) { double num7; double y = 0.0; double dfx = 0.0; if ((x0 < data.xmin) || (x0 > data.xmax)) { return(false); } bool flag = yield_f(x0, ref y, settle, maturity, rate, price, redem, freq, basis); if (!flag) { return(flag); } if (FinancialHelper.update_data(x0, y, ref data)) { return(true); } if (Math.Abs(x0) < 1E-10) { if (data.havexneg && data.havexpos) { num7 = Math.Abs((double)(data.xpos - data.xneg)) / 1000000.0; } else { num7 = (data.xmax - data.xmin) / 1000000.0; } } else { num7 = Math.Abs(x0) / 1000000.0; } flag = this.fake_df(x0, ref dfx, num7, ref data, settle, maturity, rate, price, redem, freq, basis); if (!flag) { return(flag); } if (dfx == 0.0) { return(false); } double num3 = x0 - ((1.000001 * y) / dfx); if (num3 == x0) { data.root = x0; return(true); } double num4 = Math.Abs((double)(num3 - x0)) / (Math.Abs(x0) + Math.Abs(num3)); x0 = num3; if (num4 < num2) { data.root = x0; return(true); } } return(false); }
private bool goal_seek_bisection(ref GoalSeekData data, DateTime[] dates, double[] values) { int num3 = 0; if (data.havexpos && data.havexneg) { double num2 = Math.Abs((double)(data.xpos - data.xneg)) / (Math.Abs(data.xpos) + Math.Abs(data.xneg)); for (int i = 0; i < 0x6c; i++) { double xpos; double yneg; double num10; double num11; double rate = 0.0; double y = 0.0; int num6 = ((i % 4) == 0) ? 1 : (((i % 4) == 2) ? 2 : 3); Label_006F: switch (num6) { case 0: rate = data.xpos - (data.ypos * ((data.xneg - data.xpos) / (data.yneg - data.ypos))); goto Label_0295; case 1: rate = (data.xpos + data.xneg) / 2.0; if (!xirr_f(rate, ref y, dates, values)) { continue; } if (y != 0.0) { break; } FinancialHelper.update_data(rate, y, ref data); return(true); case 2: xpos = 0.0; yneg = 0.0; num10 = 0.0; num11 = 0.0; if (num2 <= 0.1) { goto Label_019F; } num6 = 3; goto Label_006F; case 3: rate = (data.xpos + data.xneg) / 2.0; goto Label_0295; default: goto Label_0295; } double num7 = Math.Sqrt((y * y) - (data.ypos * data.yneg)); if (num7 == 0.0) { continue; } rate += ((rate - data.xpos) * y) / num7; goto Label_0295; Label_019F: switch ((num3++ % 4)) { case 0: xpos = data.xpos; xpos = data.ypos; break; case 2: xpos = data.xneg; yneg = data.yneg; break; default: xpos = (data.xpos + data.xneg) / 2.0; if (!xirr_f(xpos, ref yneg, dates, values)) { continue; } break; } num10 = Math.Abs((double)(data.xpos - data.xneg)) / 1000000.0; if (!this.fake_df(xpos, ref num11, num10, ref data, dates, values) || (num11 == 0.0)) { continue; } rate = xpos - ((1.01 * yneg) / num11); if (((rate < data.xpos) && (rate < data.xneg)) || ((rate > data.xpos) && (rate > data.xneg))) { continue; } Label_0295: if (xirr_f(rate, ref y, dates, values)) { if (FinancialHelper.update_data(rate, y, ref data)) { return(true); } num2 = Math.Abs((double)(data.xpos - data.xneg)) / (Math.Abs(data.xpos) + Math.Abs(data.xneg)); if (num2 < data.precision) { if (data.yneg < y) { y = data.yneg; rate = data.xneg; } if (data.ypos < y) { y = data.ypos; rate = data.xpos; } data.root = rate; return(true); } } } } return(false); }