示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }