src/libm/s_floor.c
author Sam Lantinga <slouken@libsdl.org>
Mon, 22 Jun 2015 23:36:06 -0700
changeset 9776 952ff8a5076f
parent 6044 35448a5ea044
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@2758
     1
/* @(#)s_floor.c 5.1 93/09/24 */
slouken@2758
     2
/*
slouken@2758
     3
 * ====================================================
slouken@2758
     4
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
slouken@2758
     5
 *
slouken@2758
     6
 * Developed at SunPro, a Sun Microsystems, Inc. business.
slouken@2758
     7
 * Permission to use, copy, modify, and distribute this
slouken@2758
     8
 * software is freely granted, provided that this notice
slouken@2758
     9
 * is preserved.
slouken@2758
    10
 * ====================================================
slouken@2758
    11
 */
slouken@2758
    12
slouken@2758
    13
#if defined(LIBM_SCCS) && !defined(lint)
slouken@3162
    14
static const char rcsid[] =
slouken@2758
    15
    "$NetBSD: s_floor.c,v 1.8 1995/05/10 20:47:20 jtc Exp $";
slouken@2758
    16
#endif
slouken@2758
    17
slouken@2758
    18
/*
slouken@2758
    19
 * floor(x)
slouken@2758
    20
 * Return x rounded toward -inf to integral value
slouken@2758
    21
 * Method:
slouken@2758
    22
 *	Bit twiddling.
slouken@2758
    23
 * Exception:
slouken@2758
    24
 *	Inexact flag raised if x not equal to floor(x).
slouken@2758
    25
 */
slouken@2758
    26
slouken@6044
    27
#include "math_libm.h"
slouken@2758
    28
#include "math_private.h"
slouken@2758
    29
slouken@2758
    30
#ifdef __STDC__
slouken@3337
    31
static const double huge_val = 1.0e300;
slouken@2758
    32
#else
slouken@3337
    33
static double huge_val = 1.0e300;
slouken@2758
    34
#endif
slouken@2758
    35
slouken@2758
    36
libm_hidden_proto(floor)
slouken@2758
    37
#ifdef __STDC__
slouken@2758
    38
     double floor(double x)
slouken@2758
    39
#else
slouken@2758
    40
     double floor(x)
slouken@2758
    41
     double x;
slouken@2758
    42
#endif
slouken@2758
    43
{
slouken@2758
    44
    int32_t i0, i1, j0;
slouken@2758
    45
    u_int32_t i, j;
slouken@2758
    46
    EXTRACT_WORDS(i0, i1, x);
slouken@2758
    47
    j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
slouken@2758
    48
    if (j0 < 20) {
slouken@2758
    49
        if (j0 < 0) {           /* raise inexact if x != 0 */
slouken@3337
    50
            if (huge_val + x > 0.0) {       /* return 0*sign(x) if |x|<1 */
slouken@2758
    51
                if (i0 >= 0) {
slouken@2758
    52
                    i0 = i1 = 0;
slouken@2758
    53
                } else if (((i0 & 0x7fffffff) | i1) != 0) {
slouken@2758
    54
                    i0 = 0xbff00000;
slouken@2758
    55
                    i1 = 0;
slouken@2758
    56
                }
slouken@2758
    57
            }
slouken@2758
    58
        } else {
slouken@2758
    59
            i = (0x000fffff) >> j0;
slouken@2758
    60
            if (((i0 & i) | i1) == 0)
slouken@2758
    61
                return x;       /* x is integral */
slouken@3337
    62
            if (huge_val + x > 0.0) {       /* raise inexact flag */
slouken@2758
    63
                if (i0 < 0)
slouken@2758
    64
                    i0 += (0x00100000) >> j0;
slouken@2758
    65
                i0 &= (~i);
slouken@2758
    66
                i1 = 0;
slouken@2758
    67
            }
slouken@2758
    68
        }
slouken@2758
    69
    } else if (j0 > 51) {
slouken@2758
    70
        if (j0 == 0x400)
slouken@2758
    71
            return x + x;       /* inf or NaN */
slouken@2758
    72
        else
slouken@2758
    73
            return x;           /* x is integral */
slouken@2758
    74
    } else {
slouken@2758
    75
        i = ((u_int32_t) (0xffffffff)) >> (j0 - 20);
slouken@2758
    76
        if ((i1 & i) == 0)
slouken@2758
    77
            return x;           /* x is integral */
slouken@3337
    78
        if (huge_val + x > 0.0) {   /* raise inexact flag */
slouken@2758
    79
            if (i0 < 0) {
slouken@2758
    80
                if (j0 == 20)
slouken@2758
    81
                    i0 += 1;
slouken@2758
    82
                else {
slouken@2758
    83
                    j = i1 + (1 << (52 - j0));
slouken@2765
    84
                    if (j < (u_int32_t) i1)
slouken@2758
    85
                        i0 += 1;        /* got a carry */
slouken@2758
    86
                    i1 = j;
slouken@2758
    87
                }
slouken@2758
    88
            }
slouken@2758
    89
            i1 &= (~i);
slouken@2758
    90
        }
slouken@2758
    91
    }
slouken@2758
    92
    INSERT_WORDS(x, i0, i1);
slouken@2758
    93
    return x;
slouken@2758
    94
}
slouken@2758
    95
slouken@2758
    96
libm_hidden_def(floor)