src/libm/s_scalbn.c
author Sam Lantinga <slouken@libsdl.org>
Mon, 22 Jun 2015 23:36:06 -0700
changeset 9776 952ff8a5076f
parent 7678 286c42d7c5ed
child 11683 48bcba563d9c
permissions -rw-r--r--
Fixed bug 3030 - SDL_RecreateWindow fails to restore title, icon, etc.

Adam M.

It loses the title and icon when window recreation fails. For instance, this may happen when trying to create an OpenGL ES window on a system that doesn't support it. But at that point, the title and icon have already been lost.
slouken@2756
     1
/* @(#)s_scalbn.c 5.1 93/09/24 */
slouken@2756
     2
/*
slouken@2756
     3
 * ====================================================
slouken@2756
     4
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
slouken@2756
     5
 *
slouken@2756
     6
 * Developed at SunPro, a Sun Microsystems, Inc. business.
slouken@2756
     7
 * Permission to use, copy, modify, and distribute this
slouken@2756
     8
 * software is freely granted, provided that this notice
slouken@2756
     9
 * is preserved.
slouken@2756
    10
 * ====================================================
slouken@2756
    11
 */
slouken@2756
    12
slouken@2756
    13
#if defined(LIBM_SCCS) && !defined(lint)
slouken@3162
    14
static const char rcsid[] =
slouken@2756
    15
    "$NetBSD: s_scalbn.c,v 1.8 1995/05/10 20:48:08 jtc Exp $";
slouken@2756
    16
#endif
slouken@2756
    17
slouken@2756
    18
/*
slouken@2756
    19
 * scalbn (double x, int n)
slouken@2756
    20
 * scalbn(x,n) returns x* 2**n  computed by  exponent
slouken@2756
    21
 * manipulation rather than by actually performing an
slouken@2756
    22
 * exponentiation or a multiplication.
slouken@2756
    23
 */
slouken@2756
    24
slouken@6044
    25
#include "math_libm.h"
slouken@2756
    26
#include "math_private.h"
slouken@2756
    27
slouken@2756
    28
libm_hidden_proto(copysign)
slouken@2756
    29
#ifdef __STDC__
slouken@2756
    30
     static const double
slouken@2756
    31
#else
slouken@2756
    32
     static double
slouken@2756
    33
#endif
slouken@2756
    34
       two54 = 1.80143985094819840000e+16,      /* 0x43500000, 0x00000000 */
slouken@2756
    35
         twom54 = 5.55111512312578270212e-17,   /* 0x3C900000, 0x00000000 */
slouken@3337
    36
         huge_val = 1.0e+300, tiny = 1.0e-300;
slouken@2756
    37
slouken@2756
    38
libm_hidden_proto(scalbn)
slouken@2756
    39
#ifdef __STDC__
slouken@2756
    40
     double scalbn(double x, int n)
slouken@2756
    41
#else
slouken@2756
    42
     double scalbn(x, n)
slouken@2756
    43
     double x;
slouken@2756
    44
     int n;
slouken@2756
    45
#endif
slouken@2756
    46
{
slouken@2756
    47
    int32_t k, hx, lx;
slouken@2756
    48
    EXTRACT_WORDS(hx, lx, x);
slouken@2756
    49
    k = (hx & 0x7ff00000) >> 20;        /* extract exponent */
slouken@2756
    50
    if (k == 0) {               /* 0 or subnormal x */
slouken@2756
    51
        if ((lx | (hx & 0x7fffffff)) == 0)
slouken@2756
    52
            return x;           /* +-0 */
slouken@2756
    53
        x *= two54;
slouken@2756
    54
        GET_HIGH_WORD(hx, x);
slouken@2756
    55
        k = ((hx & 0x7ff00000) >> 20) - 54;
slouken@2756
    56
        if (n < -50000)
gabomdq@7678
    57
            return tiny * x;    /* underflow */
slouken@2756
    58
    }
slouken@2756
    59
    if (k == 0x7ff)
slouken@2756
    60
        return x + x;           /* NaN or Inf */
slouken@2756
    61
    k = k + n;
slouken@2756
    62
    if (k > 0x7fe)
slouken@3337
    63
        return huge_val * copysign(huge_val, x);        /* overflow  */
slouken@2756
    64
    if (k > 0) {                /* normal result */
slouken@2756
    65
        SET_HIGH_WORD(x, (hx & 0x800fffff) | (k << 20));
slouken@2756
    66
        return x;
slouken@2756
    67
    }
slouken@2756
    68
    if (k <= -54) {
slouken@2756
    69
        if (n > 50000)          /* in case integer overflow in n+k */
gabomdq@7678
    70
            return huge_val * copysign(huge_val, x);    /* overflow */
slouken@2756
    71
        else
gabomdq@7678
    72
            return tiny * copysign(tiny, x);    /* underflow */
slouken@2756
    73
    }
slouken@2756
    74
    k += 54;                    /* subnormal result */
slouken@2756
    75
    SET_HIGH_WORD(x, (hx & 0x800fffff) | (k << 20));
slouken@2756
    76
    return x * twom54;
slouken@2756
    77
}
slouken@2756
    78
slouken@2756
    79
libm_hidden_def(scalbn)