Mercurial > cpython-lru_cache-weakref
diff Modules/mathmodule.c @ 64969:c8dc4b5e54fb
Issue #9599: Tweak loghelper algorithm to return slightly improved results for powers of 2.
| author | Mark Dickinson <dickinsm@gmail.com> |
|---|---|
| date | Tue, 28 Sep 2010 07:22:27 +0000 |
| parents | 4c11e4140ced |
| children | a9349fd3d0f7 |
line wrap: on
line diff
--- a/Modules/mathmodule.c Tue Sep 28 07:03:40 2010 +0000 +++ b/Modules/mathmodule.c Tue Sep 28 07:22:27 2010 +0000 @@ -1572,12 +1572,14 @@ "math domain error"); return NULL; } - /* Special case for log(1), to make sure we get an - exact result there. */ - if (e == 1 && x == 0.5) - return PyFloat_FromDouble(0.0); - /* Value is ~= x * 2**e, so the log ~= log(x) + log(2) * e. */ - x = func(x) + func(2.0) * e; + /* Value is ~= x * 2**e, so the log ~= log(x) + log(2) * e. + + It's slightly better to compute the log as log(2 * x) + log(2) * (e + - 1): then when 'arg' is a power of 2, 2**k say, this gives us 0.0 + + log(2) * k instead of log(0.5) + log(2)*(k+1), and so marginally + increases the chances of log(arg, 2) returning the correct result. + */ + x = func(2.0 * x) + func(2.0) * (e - 1); return PyFloat_FromDouble(x); }
