source: soft/giet_vm/giet_libs/math/s_floor.c @ 777

Last change on this file since 777 was 777, checked in by meunier, 8 years ago
  • Ajout de quelques fonction dans la lib math
  • Déplacement de certaines fonctions de stdlib vers string
File size: 2.3 KB
Line 
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/* Modified for GIET-VM static OS at UPMC, France 2015.
13*/
14
15/*
16 * floor(x)
17 * Return x rounded toward -inf to integral value
18 * Method:
19 *      Bit twiddling.
20 * Exception:
21 *      Inexact flag raised if x not equal to floor(x).
22 */
23
24#include "math_private.h"
25
26static const double huge = 1.0e300;
27
28double floor(double x)
29{
30    int32_t i0, i1, j0;
31    uint32_t i, j;
32    EXTRACT_WORDS(i0, i1, x);
33    j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
34    if (j0 < 20) {
35        if (j0 < 0) {   /* raise inexact if x != 0 */
36            if (huge + x > 0.0) {/* return 0*sign(x) if |x|<1 */
37                if (i0 >= 0) {
38                    i0 = i1 = 0;
39                }
40                else if (((i0 & 0x7fffffff) | i1) != 0) {
41                    i0 = 0xbff00000;
42                    i1 = 0;
43                }
44            }
45        }
46        else {
47            i = (0x000fffff) >> j0;
48            if (((i0 & i) | i1) == 0) {
49                return x; /* x is integral */
50            }
51            if (huge + x > 0.0) {       /* raise inexact flag */
52                if (i0 < 0) {
53                    i0 += (0x00100000) >> j0;
54                }
55                i0 &= (~i);
56                i1 = 0;
57            }
58        }
59    }
60    else if (j0 > 51) {
61        if (j0 == 0x400) {
62            return x + x;       /* inf or NaN */
63        }
64        else {
65            return x;           /* x is integral */
66        }
67    }
68    else {
69        i = ((uint32_t) (0xffffffff)) >> (j0 - 20);
70        if ((i1 & i)== 0) {
71            return x;   /* x is integral */
72        }
73        if (huge + x > 0.0) {           /* raise inexact flag */
74            if (i0 < 0) {
75                if (j0 == 20) {
76                    i0 += 1;
77                }
78                else {
79                    j = i1 + (1 << (52 - j0));
80                    if (j < i1) {
81                        i0 += 1 ;       /* got a carry */
82                    }
83                    i1 = j;
84                }
85            }
86            i1 &= (~i);
87        }
88    }
89    INSERT_WORDS(x, i0, i1);
90    return x;
91}
92
Note: See TracBrowser for help on using the repository browser.