# math.ln
The natural logarithm, computed with nothing but `+`, `-`, `*` and `/`, so
TypeScript, Python and Rust return the same double for the same input.
`Math.log`, Python's `math.log` and Rust's `f64::ln` all call their
platform's maths library, and IEEE 754 does not require those to be correctly
rounded: the last bit can differ between a browser, CPython on glibc and Rust
on macOS. Usually that does not matter. It does when the result is then
rounded for display or compared against a threshold, because a value next to
the boundary goes one way in one language and the other way in another. A log
scale, a colour conversion or a growth rate that must agree across languages
uses this instead.
## Method
1. Write x = m x 2^e with m in (sqrt(1/2), sqrt(2)], by halving or doubling,
which is exact for every double, subnormals included.
2. With s = (m - 1) / (m + 1), |s| < 0.172, ln m = 2 atanh s =
2s (1 + s²/3 + s⁴/5 + ... + s²⁴/25), summed by Horner's rule.
3. ln x = e ln 2 + ln m, with ln 2 split into a high part whose trailing bits
are zero (so e x high is exact) and a low correction, as in fdlibm.
The result is within 2 units in the last place of the true logarithm over the
whole positive range (checked against a correctly rounded reference), and
bit-identical in all three languages because every step is an IEEE operation
performed in the same order. `ln(1)` is exactly 0.
Zero, negative numbers, infinity and NaN are errors.
Sources: W. J. Cody and W. Waite, *Software Manual for the Elementary
Functions* (1980); Sun Microsystems fdlibm, `e_log.c` (the ln 2 split).
## Notices
Derived from fdlibm e_log.c.
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunSoft, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
The same notice heads each implementation file.
1.0.1 adds its attribution notices (NOTICE). The code is unchanged apart from that notice at the top of each implementation file; the tests are unchanged.