OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib/] [newlib/] [libm/] [math/] [s_rint.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 39 lampret
 
2
/* @(#)s_rint.c 5.1 93/09/24 */
3
/*
4
 * ====================================================
5
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6
 *
7
 * Developed at SunPro, a Sun Microsystems, Inc. business.
8
 * Permission to use, copy, modify, and distribute this
9
 * software is freely granted, provided that this notice
10
 * is preserved.
11
 * ====================================================
12
 */
13
 
14
/*
15
 * rint(x)
16
 * Return x rounded to integral value according to the prevailing
17
 * rounding mode.
18
 * Method:
19
 *      Using floating addition.
20
 * Exception:
21
 *      Inexact flag raised if x not equal to rint(x).
22
 */
23
 
24
#include "fdlibm.h"
25
 
26
#ifndef _DOUBLE_IS_32BITS
27
 
28
#ifdef __STDC__
29
static const double
30
#else
31
static double
32
#endif
33
TWO52[2]={
34
  4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
35
 -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
36
};
37
 
38
#ifdef __STDC__
39
        double rint(double x)
40
#else
41
        double rint(x)
42
        double x;
43
#endif
44
{
45
        __int32_t i0,j0,sx;
46
        __uint32_t i,i1;
47
        double w,t;
48
        EXTRACT_WORDS(i0,i1,x);
49
        sx = (i0>>31)&1;
50
        j0 = ((i0>>20)&0x7ff)-0x3ff;
51
        if(j0<20) {
52
            if(j0<0) {
53
                if(((i0&0x7fffffff)|i1)==0) return x;
54
                i1 |= (i0&0x0fffff);
55
                i0 &= 0xfffe0000;
56
                i0 |= ((i1|-i1)>>12)&0x80000;
57
                SET_HIGH_WORD(x,i0);
58
                w = TWO52[sx]+x;
59
                t =  w-TWO52[sx];
60
                GET_HIGH_WORD(i0,t);
61
                SET_HIGH_WORD(t,(i0&0x7fffffff)|(sx<<31));
62
                return t;
63
            } else {
64
                i = (0x000fffff)>>j0;
65
                if(((i0&i)|i1)==0) return x; /* x is integral */
66
                i>>=1;
67
                if(((i0&i)|i1)!=0) {
68
                    if(j0==19) i1 = 0x40000000; else
69
                    i0 = (i0&(~i))|((0x20000)>>j0);
70
                }
71
            }
72
        } else if (j0>51) {
73
            if(j0==0x400) return x+x;   /* inf or NaN */
74
            else return x;              /* x is integral */
75
        } else {
76
            i = ((__uint32_t)(0xffffffff))>>(j0-20);
77
            if((i1&i)==0) return x;      /* x is integral */
78
            i>>=1;
79
            if((i1&i)!=0) i1 = (i1&(~i))|((0x40000000)>>(j0-20));
80
        }
81
        INSERT_WORDS(x,i0,i1);
82
        w = TWO52[sx]+x;
83
        return w-TWO52[sx];
84
}
85
 
86
#endif /* _DOUBLE_IS_32BITS */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.