mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 664b511c0a
			
		
	
	
		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. ........
		
			
				
	
	
		
			31 lines
		
	
	
	
		
			840 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			31 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;
 | |
| }
 |