SDL  2.0
s_scalbn.c File Reference
#include "math_libm.h"
#include "math_private.h"
+ Include dependency graph for s_scalbn.c:

Go to the source code of this file.

Functions

 libm_hidden_proto (copysign)
 

Function Documentation

libm_hidden_proto ( copysign  )

Definition at line 28 of file s_scalbn.c.

References copysign, EXTRACT_WORDS, GET_HIGH_WORD, huge_val, libm_hidden_def, scalbn, SET_HIGH_WORD, tiny, and two54.

46 {
47  int32_t k, hx, lx;
48  EXTRACT_WORDS(hx, lx, x);
49  k = (hx & 0x7ff00000) >> 20; /* extract exponent */
50  if (k == 0) { /* 0 or subnormal x */
51  if ((lx | (hx & 0x7fffffff)) == 0)
52  return x; /* +-0 */
53  x *= two54;
54  GET_HIGH_WORD(hx, x);
55  k = ((hx & 0x7ff00000) >> 20) - 54;
56  if (n < -50000)
57  return tiny * x; /* underflow */
58  }
59  if (k == 0x7ff)
60  return x + x; /* NaN or Inf */
61  k = k + n;
62  if (k > 0x7fe)
63  return huge_val * copysign(huge_val, x); /* overflow */
64  if (k > 0) { /* normal result */
65  SET_HIGH_WORD(x, (hx & 0x800fffff) | (k << 20));
66  return x;
67  }
68  if (k <= -54) {
69  if (n > 50000) /* in case integer overflow in n+k */
70  return huge_val * copysign(huge_val, x); /* overflow */
71  else
72  return tiny * copysign(tiny, x); /* underflow */
73  }
74  k += 54; /* subnormal result */
75  SET_HIGH_WORD(x, (hx & 0x800fffff) | (k << 20));
76  return x * twom54;
77 }
#define GET_HIGH_WORD(i, d)
Definition: math_private.h:103
GLdouble n
signed int int32_t
tiny
Definition: e_pow.c:79
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1567
#define SET_HIGH_WORD(d, v)
Definition: math_private.h:131
#define EXTRACT_WORDS(ix0, ix1, d)
Definition: math_private.h:93
static double two54
Definition: e_log.c:79
huge_val
Definition: e_pow.c:79
#define copysign
Definition: math_private.h:34