mirror of
https://github.com/python/cpython.git
synced 2025-10-17 12:18:23 +00:00
Merged revisions 76861 via svnmerge from
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. ........
This commit is contained in:
parent
ef1992b9fb
commit
664b511c0a
13 changed files with 162 additions and 10 deletions
31
Modules/_math.c
Normal file
31
Modules/_math.c
Normal file
|
@ -0,0 +1,31 @@
|
|||
/* 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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue