|
Last change
on this file since 603 was 2, checked in by bird, 23 years ago |
|
Initial revision
|
-
Property cvs2svn:cvs-rev
set to
1.1
-
Property svn:eol-style
set to
native
-
Property svn:executable
set to
*
|
|
File size:
1.6 KB
|
| Line | |
|---|
| 1 | /* sf_rint.c -- float version of s_rint.c.
|
|---|
| 2 | * Conversion to float by Ian Lance Taylor, Cygnus Support, [email protected].
|
|---|
| 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) */
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.