function : mpd_qexp @ (file: "Python-3.3.0a4/Modules/_decimal/libmpdec/mpdecimal.c", line: 4092)~4165 if (mpd_isspecial(a)) { if (mpd_qcheck_nan(result, a, ctx, status)) { return; } if (mpd_isnegative(a)) { _settriple(result, MPD_POS, 0, 0); } else { mpd_setspecial(result, MPD_POS, MPD_INF); } return; } if (mpd_iszerocoeff(a)) { _settriple(result, MPD_POS, 1, 0); return; } workctx = *ctx; workctx.round = MPD_ROUND_HALF_EVEN; if (ctx->allcr) { MPD_NEW_STATIC(t1, 0,0,0,0); MPD_NEW_STATIC(t2, 0,0,0,0); MPD_NEW_STATIC(ulp, 0,0,0,0); MPD_NEW_STATIC(aa, 0,0,0,0); mpd_ssize_t prec; if (result == a) { if (!mpd_qcopy(&aa, a, status)) { mpd_seterror(result, MPD_Malloc_error, status); return; } a = &aa; } workctx.clamp = 0; prec = ctx->prec + 3; while (1) { workctx.prec = prec; _mpd_qexp(result, a, &workctx, status); _ssettriple(&ulp, MPD_POS, 1, result->exp + result->digits-workctx.prec); /* * At this point: * 1) abs(result - e**x) < 0.5 * 10**(-prec) * e**x * 2) result - ulp < e**x < result + ulp * 3) result - ulp < result < result + ulp * * If round(result-ulp)==round(result+ulp), then * round(result)==round(e**x). Therefore the result * is correctly rounded. */ workctx.prec = ctx->prec; mpd_qadd(&t1, result, &ulp, &workctx, &workctx.status); mpd_qsub(&t2, result, &ulp, &workctx, &workctx.status); if (mpd_isspecial(result) || mpd_iszerocoeff(result) || mpd_qcmp(&t1, &t2, status) == 0) { workctx.clamp = ctx->clamp; mpd_check_underflow(result, &workctx, status); mpd_qfinalize(result, &workctx, status); break; } prec += MPD_RDIGITS; } mpd_del(&t1); mpd_del(&t2); mpd_del(&ulp); mpd_del(&aa); } else { _mpd_qexp(result, a, &workctx, status); mpd_check_underflow(result, &workctx, status); mpd_qfinalize(result, &workctx, status); function : mpd_qln @ (file: "Python-3.3.0a4/Modules/_decimal/libmpdec/mpdecimal.c", line: 4525)~4612 if (mpd_isspecial(a)) { if (mpd_qcheck_nan(result, a, ctx, status)) { return; } if (mpd_isnegative(a)) { mpd_seterror(result, MPD_Invalid_operation, status); return; } mpd_setspecial(result, MPD_POS, MPD_INF); return; } if (mpd_iszerocoeff(a)) { mpd_setspecial(result, MPD_NEG, MPD_INF); return; } if (mpd_isnegative(a)) { mpd_seterror(result, MPD_Invalid_operation, status); return; } if (_mpd_cmp(a, &one) == 0) { _settriple(result, MPD_POS, 0, 0); return; } /* Check if the result will overflow. * * 1) adjexp(a) + 1 > log10(a) >= adjexp(a) * * 2) |log10(a)| >= adjexp(a), if adjexp(a) >= 0 * |log10(a)| > -adjexp(a)-1, if adjexp(a) < 0 * * 3) |log(a)| > 2*|log10(a)| */ adjexp = mpd_adjexp(a); t = (adjexp < 0) ? -adjexp-1 : adjexp; t *= 2; if (mpd_exp_digits(t)-1 > ctx->emax) { *status |= MPD_Overflow|MPD_Inexact|MPD_Rounded; mpd_setspecial(result, (adjexp<0), MPD_INF); return; } workctx = *ctx; workctx.round = MPD_ROUND_HALF_EVEN; if (ctx->allcr) { MPD_NEW_STATIC(t1, 0,0,0,0); MPD_NEW_STATIC(t2, 0,0,0,0); MPD_NEW_STATIC(ulp, 0,0,0,0); MPD_NEW_STATIC(aa, 0,0,0,0); mpd_ssize_t prec; if (result == a) { if (!mpd_qcopy(&aa, a, status)) { mpd_seterror(result, MPD_Malloc_error, status); return; } a = &aa; } workctx.clamp = 0; prec = ctx->prec + 3; while (1) { workctx.prec = prec; _mpd_qln(result, a, &workctx, status); _ssettriple(&ulp, MPD_POS, 1, result->exp + result->digits-workctx.prec-1); workctx.prec = ctx->prec; mpd_qadd(&t1, result, &ulp, &workctx, &workctx.status); mpd_qsub(&t2, result, &ulp, &workctx, &workctx.status); if (mpd_isspecial(result) || mpd_iszerocoeff(result) || mpd_qcmp(&t1, &t2, status) == 0) { workctx.clamp = ctx->clamp; mpd_check_underflow(result, &workctx, status); mpd_qfinalize(result, &workctx, status); break; } prec += MPD_RDIGITS; } mpd_del(&t1); mpd_del(&t2); mpd_del(&ulp); mpd_del(&aa); } else { _mpd_qln(result, a, &workctx, status); mpd_check_underflow(result, &workctx, status); mpd_qfinalize(result, &workctx, status);