what's the reasonale of loghelper() in mathmodule.c

Mark Dickinson dickinsm at gmail.com
Wed Apr 9 15:11:48 CEST 2008


On Apr 9, 4:38 am, rockins <ybc2... at gmail.com> wrote:
> I cannot understand it well, can anyone explain me why and how
> loghelper() can compute any base logarithm? Or could anyone give me
> some reference(such as, books or papers)?

loghelper is there so that log(n) can be computed for any positive
integer n---it's nothing to do with computing logs to an arbitrary
base.

All of the other math functions convert an integer argument to a float
first.  That conversion fails if the integer is larger than the
largest
representable float (around 1.7e308 on most systems).  For example:

>>> from math import sqrt, log
>>> sqrt(10**600)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: long int too large to convert to float
>>> log(10**600)
1381.5510557964274

The sqrt call first tries to convert 10**600 to a float, giving an
OverflowError (even though the actual square root *is* representable
as a float).  The log call goes through loghelper instead, which
doesn't try to convert 10**600 to a float, but instead computes
the log based on the top few bits of 10**600 (in its internal
binary representation) and on the number of bits required to
represent 10**600.

You're not going to learn much about math function implementations
from mathmodule.c:  all it does it wrap the platform libm functions.

Mark



More information about the Python-list mailing list