65,182
社区成员




牛顿法就可以了, 精度, 速度都还是可以的, 像这样子.
double slove(double a)
{
double x, diff, prec;
if(a>1e20)
return a; /* overflow */
if(a < -715)
return 0.; /* underflow */
if(a > 1)
x = a, prec = a * 1e-10;
else if(fabs(a) <= 1)
x = .567, prec = 1e-10;
else
x = exp(a), prec = -a * 1e-10;
do
{
diff = log(x)+x-a;
x -= diff / (1/x + 1);
} while(fabs(diff) > prec);
return x - diff / (1/x + 1);
}