86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /* @(#)s_log2.c 5.1 93/09/24 */
 | |
| /* Modification from s_exp10.c Yaakov Selkowitz 2009.  */
 | |
| 
 | |
| /*
 | |
|  * ====================================================
 | |
|  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 | |
|  *
 | |
|  * Developed at SunPro, a Sun Microsystems, Inc. business.
 | |
|  * Permission to use, copy, modify, and distribute this
 | |
|  * software is freely granted, provided that this notice
 | |
|  * is preserved.
 | |
|  * ====================================================
 | |
|  */
 | |
| 
 | |
| /*
 | |
| FUNCTION
 | |
| 	<<log2>>, <<log2f>>--base 2 logarithm
 | |
| INDEX
 | |
| 	log2
 | |
| INDEX
 | |
| 	log2f
 | |
| 
 | |
| ANSI_SYNOPSIS
 | |
| 	#include <math.h>
 | |
| 	double log2(double <[x]>);
 | |
| 	float log2f(float <[x]>);
 | |
| 
 | |
| DESCRIPTION
 | |
| The <<log2>> functions compute the base-2 logarithm of <[x]>.  A domain error
 | |
| occurs if the argument is less than zero.  A range error occurs if the
 | |
| argument is zero.
 | |
| 
 | |
| The Newlib implementations are not full, intrinisic calculations, but
 | |
| rather are derivatives based on <<log>>.  (Accuracy might be slightly off from
 | |
| a direct calculation.)  In addition to functions, they are also implemented as
 | |
| macros defined in math.h:
 | |
| . #define log2(x) (log (x) / _M_LOG2_E)
 | |
| . #define log2f(x) (logf (x) / (float) _M_LOG2_E)
 | |
| To use the functions instead, just undefine the macros first.
 | |
| 
 | |
| You can use the (non-ANSI) function <<matherr>> to specify error
 | |
| handling for these functions, indirectly through the respective <<log>>
 | |
| function. 
 | |
| 
 | |
| RETURNS
 | |
| The <<log2>> functions return
 | |
| @ifnottex
 | |
| <<log base-2(<[x]>)>>
 | |
| @end ifnottex
 | |
| @tex
 | |
| $log_2(x)$
 | |
| @end tex
 | |
| on success.
 | |
| When <[x]> is zero, the
 | |
| returned value is <<-HUGE_VAL>> and <<errno>> is set to <<ERANGE>>.
 | |
| When <[x]> is negative, the returned value is NaN (not a number) and
 | |
| <<errno>> is set to <<EDOM>>.  You can control the error behavior via
 | |
| <<matherr>>.
 | |
| 
 | |
| PORTABILITY
 | |
| C99, POSIX, System V Interface Definition (Issue 6).
 | |
| */
 | |
| 
 | |
| /*
 | |
|  * wrapper log2(x)
 | |
|  */
 | |
| 
 | |
| #include "fdlibm.h"
 | |
| #include <errno.h>
 | |
| #include <math.h>
 | |
| #undef log2
 | |
| 
 | |
| #ifndef _DOUBLE_IS_32BITS
 | |
| 
 | |
| #ifdef __STDC__
 | |
| 	double log2(double x)		/* wrapper log2 */
 | |
| #else
 | |
| 	double log2(x)			/* wrapper log2 */
 | |
| 	double x;
 | |
| #endif
 | |
| {
 | |
|   return (log(x) / M_LOG2_E);
 | |
| }
 | |
| 
 | |
| #endif /* defined(_DOUBLE_IS_32BITS) */
 |