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

Go to the source code of this file.

Functions

double scalbln (double x, long n)
 
 libm_hidden_def (scalbln)
 

Variables

static const double two54 = 1.80143985094819840000e+16
 
static const double twom54 = 5.55111512312578270212e-17
 
static const double huge = 1.0e+300
 
static const double tiny = 1.0e-300
 

Function Documentation

◆ libm_hidden_def()

libm_hidden_def ( scalbln  )

Definition at line 66 of file s_scalbn.c.

70 {
71  return scalbln(x, n);
72 }
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
GLdouble n
double scalbln(double x, long n)
Definition: s_scalbn.c:33

References scalbln().

◆ scalbln()

double scalbln ( double  x,
long  n 
)

Definition at line 33 of file s_scalbn.c.

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 }
signed int int32_t
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
#define SET_HIGH_WORD(d, v)
Definition: math_private.h:137
#define EXTRACT_WORDS(ix0, ix1, d)
Definition: math_private.h:99
#define GET_HIGH_WORD(i, d)
Definition: math_private.h:109
double copysign(double x, double y)
Definition: s_copysign.c:21
static const double two54
Definition: s_scalbn.c:28
static const double tiny
Definition: s_scalbn.c:31
static const double twom54
Definition: s_scalbn.c:29
static const double huge
Definition: s_scalbn.c:30

References copysign(), EXTRACT_WORDS, GET_HIGH_WORD, huge, k, SET_HIGH_WORD, tiny, two54, and twom54.

Referenced by libm_hidden_def().

Variable Documentation

◆ huge

const double huge = 1.0e+300
static

Definition at line 30 of file s_scalbn.c.

Referenced by scalbln().

◆ tiny

const double tiny = 1.0e-300
static

Definition at line 31 of file s_scalbn.c.

Referenced by scalbln().

◆ two54

const double two54 = 1.80143985094819840000e+16
static

Definition at line 28 of file s_scalbn.c.

Referenced by scalbln().

◆ twom54

const double twom54 = 5.55111512312578270212e-17
static

Definition at line 29 of file s_scalbn.c.

Referenced by scalbln().