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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib/] [newlib/] [libm/] [math/] [sf_rint.c] - Blame information for rev 39

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 39 lampret
/* sf_rint.c -- float version of s_rint.c.
2
 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3
 */
4
 
5
/*
6
 * ====================================================
7
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8
 *
9
 * Developed at SunPro, a Sun Microsystems, Inc. business.
10
 * Permission to use, copy, modify, and distribute this
11
 * software is freely granted, provided that this notice
12
 * is preserved.
13
 * ====================================================
14
 */
15
 
16
#include "fdlibm.h"
17
 
18
#ifdef __STDC__
19
static const float
20
#else
21
static float
22
#endif
23
TWO23[2]={
24
  8.3886080000e+06, /* 0x4b000000 */
25
 -8.3886080000e+06, /* 0xcb000000 */
26
};
27
 
28
#ifdef __STDC__
29
        float rintf(float x)
30
#else
31
        float rintf(x)
32
        float x;
33
#endif
34
{
35
        __int32_t i0,j0,sx;
36
        __uint32_t i,i1;
37
        float w,t;
38
        GET_FLOAT_WORD(i0,x);
39
        sx = (i0>>31)&1;
40
        j0 = ((i0>>23)&0xff)-0x7f;
41
        if(j0<23) {
42
            if(j0<0) {
43
                if((i0&0x7fffffff)==0) return x;
44
                i1 = (i0&0x07fffff);
45
                i0 &= 0xfff00000;
46
                i0 |= ((i1|-i1)>>9)&0x400000;
47
                SET_FLOAT_WORD(x,i0);
48
                w = TWO23[sx]+x;
49
                t =  w-TWO23[sx];
50
                GET_FLOAT_WORD(i0,t);
51
                SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
52
                return t;
53
            } else {
54
                i = (0x007fffff)>>j0;
55
                if((i0&i)==0) return x; /* x is integral */
56
                i>>=1;
57
                if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0);
58
            }
59
        } else {
60
            if(j0==0x80) return x+x;    /* inf or NaN */
61
            else return x;              /* x is integral */
62
        }
63
        SET_FLOAT_WORD(x,i0);
64
        w = TWO23[sx]+x;
65
        return w-TWO23[sx];
66
}
67
 
68
#ifdef _DOUBLE_IS_32BITS
69
 
70
#ifdef __STDC__
71
        double rint(double x)
72
#else
73
        double rint(x)
74
        double x;
75
#endif
76
{
77
        return (double) rintf((float) x);
78
}
79
 
80
#endif /* defined(_DOUBLE_IS_32BITS) */

powered by: WebSVN 2.1.0

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