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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libm/] [common/] [s_rint.c] - Blame information for rev 816

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
 
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 t;
48
        volatile double w;
49
        EXTRACT_WORDS(i0,i1,x);
50
        sx = (i0>>31)&1;
51
        j0 = ((i0>>20)&0x7ff)-0x3ff;
52
        if(j0<20) {
53
            if(j0<0) {
54
                if(((i0&0x7fffffff)|i1)==0) return x;
55
                i1 |= (i0&0x0fffff);
56
                i0 &= 0xfffe0000;
57
                i0 |= ((i1|-i1)>>12)&0x80000;
58
                SET_HIGH_WORD(x,i0);
59
                w = TWO52[sx]+x;
60
                t =  w-TWO52[sx];
61
                GET_HIGH_WORD(i0,t);
62
                SET_HIGH_WORD(t,(i0&0x7fffffff)|(sx<<31));
63
                return t;
64
            } else {
65
                i = (0x000fffff)>>j0;
66
                if(((i0&i)|i1)==0) return x; /* x is integral */
67
                i>>=1;
68
                if(((i0&i)|i1)!=0) {
69
                    if(j0==19) i1 = 0x40000000; else
70
                    i0 = (i0&(~i))|((0x20000)>>j0);
71
                }
72
            }
73
        } else if (j0>51) {
74
            if(j0==0x400) return x+x;   /* inf or NaN */
75
            else return x;              /* x is integral */
76
        } else {
77
            i = ((__uint32_t)(0xffffffff))>>(j0-20);
78
            if((i1&i)==0) return x;      /* x is integral */
79
            i>>=1;
80
            if((i1&i)!=0) i1 = (i1&(~i))|((0x40000000)>>(j0-20));
81
        }
82
        INSERT_WORDS(x,i0,i1);
83
        w = TWO52[sx]+x;
84
        return w-TWO52[sx];
85
}
86
 
87
#endif /* _DOUBLE_IS_32BITS */
88
 
89
 
90
 

powered by: WebSVN 2.1.0

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