On Apr 9, 4:38*am, rockins <ybc2...@gmail.comwrote:

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