1 | /* @(#)s_log2.c 5.1 93/09/24 */ |
---|
2 | /* Modification from s_exp10.c Yaakov Selkowitz 2009. */ |
---|
3 | |
---|
4 | /* |
---|
5 | * ==================================================== |
---|
6 | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |
---|
7 | * |
---|
8 | * Developed at SunPro, a Sun Microsystems, Inc. business. |
---|
9 | * Permission to use, copy, modify, and distribute this |
---|
10 | * software is freely granted, provided that this notice |
---|
11 | * is preserved. |
---|
12 | * ==================================================== |
---|
13 | */ |
---|
14 | |
---|
15 | /* |
---|
16 | FUNCTION |
---|
17 | <<log2>>, <<log2f>>---base 2 logarithm |
---|
18 | INDEX |
---|
19 | log2 |
---|
20 | INDEX |
---|
21 | log2f |
---|
22 | |
---|
23 | SYNOPSIS |
---|
24 | #include <math.h> |
---|
25 | double log2(double <[x]>); |
---|
26 | float log2f(float <[x]>); |
---|
27 | |
---|
28 | DESCRIPTION |
---|
29 | The <<log2>> functions compute the base-2 logarithm of <[x]>. A domain error |
---|
30 | occurs if the argument is less than zero. A range error occurs if the |
---|
31 | argument is zero. |
---|
32 | |
---|
33 | The Newlib implementations are not full, intrinisic calculations, but |
---|
34 | rather are derivatives based on <<log>>. (Accuracy might be slightly off from |
---|
35 | a direct calculation.) In addition to functions, they are also implemented as |
---|
36 | macros defined in math.h: |
---|
37 | . #define log2(x) (log (x) / _M_LN2) |
---|
38 | . #define log2f(x) (logf (x) / (float) _M_LN2) |
---|
39 | To use the functions instead, just undefine the macros first. |
---|
40 | |
---|
41 | You can use the (non-ANSI) function <<matherr>> to specify error |
---|
42 | handling for these functions, indirectly through the respective <<log>> |
---|
43 | function. |
---|
44 | |
---|
45 | RETURNS |
---|
46 | The <<log2>> functions return |
---|
47 | @ifnottex |
---|
48 | <<log base-2(<[x]>)>> |
---|
49 | @end ifnottex |
---|
50 | @tex |
---|
51 | $log_2(x)$ |
---|
52 | @end tex |
---|
53 | on success. |
---|
54 | When <[x]> is zero, the |
---|
55 | returned value is <<-HUGE_VAL>> and <<errno>> is set to <<ERANGE>>. |
---|
56 | When <[x]> is negative, the returned value is NaN (not a number) and |
---|
57 | <<errno>> is set to <<EDOM>>. You can control the error behavior via |
---|
58 | <<matherr>>. |
---|
59 | |
---|
60 | PORTABILITY |
---|
61 | C99, POSIX, System V Interface Definition (Issue 6). |
---|
62 | */ |
---|
63 | |
---|
64 | /* |
---|
65 | * wrapper log2(x) |
---|
66 | */ |
---|
67 | |
---|
68 | #include "fdlibm.h" |
---|
69 | #include <errno.h> |
---|
70 | #include <math.h> |
---|
71 | #undef log2 |
---|
72 | |
---|
73 | #ifndef _DOUBLE_IS_32BITS |
---|
74 | |
---|
75 | #ifdef __STDC__ |
---|
76 | double log2(double x) /* wrapper log2 */ |
---|
77 | #else |
---|
78 | double log2(x) /* wrapper log2 */ |
---|
79 | double x; |
---|
80 | #endif |
---|
81 | { |
---|
82 | return (log(x) / M_LN2); |
---|
83 | } |
---|
84 | |
---|
85 | #endif /* defined(_DOUBLE_IS_32BITS) */ |
---|