source:
trunk/src/gcc/libjava/java/lang/sf_rint.c@
1392
| Last change on this file since 1392 was 2, checked in by , 23 years ago | |
|---|---|
|
|
| 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.
