Tim Peters <t...@python.org> added the comment:

CPython's log() builds on the platform C's libm facilities, and C simply 
doesn't define primitives capable of producing a worst-case < 1 ulp error 
2-argument log in reasonable time. Instead we have to build it out of two 
separate log operations, and a division. Each of those 3 operations can suffer 
its own rounding errors, which may, overall, cancel out, or build on each 
other. There's no error bound we can guarantee, although "< 2 ulp worst-case 
error" seems likely under modern libms.

Which is actually quite good. Doing better than that is out of scope for 
CPython's implementation. The easy way to get < 1 ulp is to use decimal to 
compute the intermediate results with excess precision. But that's also "too 
slow" for general use.

What Dennis did in his little test driver was fine for that, but we don't 
actually need to increase decimal's default precision at all to get < 1 ulp 
error in a converted-back-to-float-via-round-nearest result here.

Just an example (doesn't "prove" anything - but points at how to go about 
proving things):

>>> decimal.Decimal(3**8).ln() / decimal.Decimal(3).ln()
Decimal('7.999999999999999999999999999')
>>> float(_)
8.0

----------
nosy: +tim.peters
resolution:  -> wont fix
stage:  -> resolved
status: open -> closed

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue45348>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to