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); }