mirror of
https://github.com/python/cpython.git
synced 2024-11-28 20:33:54 +08:00
664b511c0a
svn+ssh://pythondev@svn.python.org/python/trunk ........ r76861 | mark.dickinson | 2009-12-16 20:13:40 +0000 (Wed, 16 Dec 2009) | 3 lines Issue #3366: Add expm1 function to math module. Thanks Eric Smith for testing on Windows. ........
32 lines
840 B
C
32 lines
840 B
C
/* Definitions of some C99 math library functions, for those platforms
|
|
that don't implement these functions already. */
|
|
|
|
#include <float.h>
|
|
#include <math.h>
|
|
|
|
/* Mathematically, expm1(x) = exp(x) - 1. The expm1 function is designed
|
|
to avoid the significant loss of precision that arises from direct
|
|
evaluation of the expression exp(x) - 1, for x near 0. */
|
|
|
|
double
|
|
_Py_expm1(double x)
|
|
{
|
|
/* For abs(x) >= log(2), it's safe to evaluate exp(x) - 1 directly; this
|
|
also works fine for infinities and nans.
|
|
|
|
For smaller x, we can use a method due to Kahan that achieves close to
|
|
full accuracy.
|
|
*/
|
|
|
|
if (fabs(x) < 0.7) {
|
|
double u;
|
|
u = exp(x);
|
|
if (u == 1.0)
|
|
return x;
|
|
else
|
|
return (u - 1.0) * x / log(u);
|
|
}
|
|
else
|
|
return exp(x) - 1.0;
|
|
}
|