SDL  2.0
s_scalbn.c
Go to the documentation of this file.
1 /*
2  * ====================================================
3  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4  *
5  * Developed at SunPro, a Sun Microsystems, Inc. business.
6  * Permission to use, copy, modify, and distribute this
7  * software is freely granted, provided that this notice
8  * is preserved.
9  * ====================================================
10  */
11 
12 /*
13  * scalbln(double x, long n)
14  * scalbln(x,n) returns x * 2**n computed by exponent
15  * manipulation rather than by actually performing an
16  * exponentiation or a multiplication.
17  */
18 
19 #include "math_libm.h"
20 #include "math_private.h"
21 #include <limits.h>
22 
23 #ifdef __WATCOMC__ /* Watcom defines huge=__huge */
24 #undef huge
25 #endif
26 
27 static const double
28 two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
29 twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
30 huge = 1.0e+300,
31 tiny = 1.0e-300;
32 
33 double scalbln(double x, long n)
34 {
35  int32_t k, hx, lx;
36 
37  EXTRACT_WORDS(hx, lx, x);
38  k = (hx & 0x7ff00000) >> 20; /* extract exponent */
39  if (k == 0) { /* 0 or subnormal x */
40  if ((lx | (hx & 0x7fffffff)) == 0)
41  return x; /* +-0 */
42  x *= two54;
43  GET_HIGH_WORD(hx, x);
44  k = ((hx & 0x7ff00000) >> 20) - 54;
45  }
46  if (k == 0x7ff)
47  return x + x; /* NaN or Inf */
48  k = (int32_t)(k + n);
49  if (k > 0x7fe)
50  return huge * copysign(huge, x); /* overflow */
51  if (n < -50000)
52  return tiny * copysign(tiny, x); /* underflow */
53  if (k > 0) { /* normal result */
54  SET_HIGH_WORD(x, (hx & 0x800fffff) | (k << 20));
55  return x;
56  }
57  if (k <= -54) {
58  if (n > 50000) /* in case integer overflow in n+k */
59  return huge * copysign(huge, x); /* overflow */
60  return tiny * copysign(tiny, x); /* underflow */
61  }
62  k += 54; /* subnormal result */
63  SET_HIGH_WORD(x, (hx & 0x800fffff) | (k << 20));
64  return x * twom54;
65 }
67 
68 
69 double scalbn(double x, int n)
70 {
71  return scalbln(x, n);
72 }
math_private.h
scalbln
double scalbln(double x, long n)
Definition: s_scalbn.c:33
tiny
static const double tiny
Definition: s_scalbn.c:31
EXTRACT_WORDS
#define EXTRACT_WORDS(ix0, ix1, d)
Definition: math_private.h:99
n
GLdouble n
Definition: SDL_opengl_glext.h:1955
twom54
static const double twom54
Definition: s_scalbn.c:29
libm_hidden_def
libm_hidden_def(scalbln)
Definition: s_scalbn.c:66
SET_HIGH_WORD
#define SET_HIGH_WORD(d, v)
Definition: math_private.h:137
two54
static const double two54
Definition: s_scalbn.c:28
scalbn
#define scalbn
Definition: math_private.h:46
math_libm.h
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
int32_t
signed int int32_t
Definition: SDL_config_windows.h:62
huge
static const double huge
Definition: s_scalbn.c:30
copysign
double copysign(double x, double y)
Definition: s_copysign.c:21
k
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int int return Display Window Cursor return Display Window return Display Drawable GC int int unsigned int unsigned int return Display Drawable GC int int _Xconst char int return Display Drawable GC int int unsigned int unsigned int return Display return Display Cursor return Display GC return XModifierKeymap return char Display Window int return Display return Display int int int return Display long XVisualInfo int return Display Window Atom long long Bool Atom Atom int unsigned long unsigned long k)
Definition: SDL_x11sym.h:80
GET_HIGH_WORD
#define GET_HIGH_WORD(i, d)
Definition: math_private.h:109