# 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.