Пример #1
0
        static void M_log_solve_cubic(BigNumber nn, BigNumber rr, int places)
        {
            BigNumber tmp0, tmp1, tmp2, tmp3, guess;
            int       ii, maxp, tolerance, local_precision;

            guess = new BigNumber();
            tmp0  = new BigNumber();
            tmp1  = new BigNumber();
            tmp2  = new BigNumber();
            tmp3  = new BigNumber();

            BigNumber.M_get_log_guess(nn, guess);

            tolerance       = -(places + 4);
            maxp            = places + 16;
            local_precision = 18;

            ii = 0;

            while (true)
            {
                BigNumber.Exp(guess, tmp1, local_precision);

                BigNumber.Sub(tmp1, nn, tmp3);
                BigNumber.Add(tmp1, nn, tmp2);

                BigNumber.Div(tmp3, tmp2, tmp1, local_precision);
                BigNumber.Mul(BigNumber.Two, tmp1, tmp0);
                BigNumber.Sub(guess, tmp0, tmp3);

                if (ii != 0)
                {
                    if (((3 * tmp0.exponent) < tolerance) || (tmp0.signum == 0))
                    {
                        break;
                    }
                }

                BigNumber.Round(tmp3, guess, local_precision);

                local_precision *= 3;

                if (local_precision > maxp)
                {
                    local_precision = maxp;
                }

                ii = 1;
            }

            BigNumber.Round(tmp3, rr, places);
        }