source: trunk/libs/newlib/src/newlib/libm/common/sf_nextafter.c @ 567

Last change on this file since 567 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 1.8 KB
Line 
1/* sf_nextafter.c -- float version of s_nextafter.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        float nextafterf(float x, float y)
20#else
21        float nextafterf(x,y)
22        float x,y;
23#endif
24{
25        __int32_t       hx,hy,ix,iy;
26
27        GET_FLOAT_WORD(hx,x);
28        GET_FLOAT_WORD(hy,y);
29        ix = hx&0x7fffffff;             /* |x| */
30        iy = hy&0x7fffffff;             /* |y| */
31
32        if(FLT_UWORD_IS_NAN(ix) ||
33           FLT_UWORD_IS_NAN(iy))
34           return x+y;
35        if(x==y) return x;              /* x=y, return x */
36        if(FLT_UWORD_IS_ZERO(ix)) {             /* x == 0 */
37            SET_FLOAT_WORD(x,(hy&0x80000000)|FLT_UWORD_MIN);
38            y = x*x;
39            if(y==x) return y; else return x;   /* raise underflow flag */
40        }
41        if(hx>=0) {                             /* x > 0 */
42            if(hx>hy) {                         /* x > y, x -= ulp */
43                hx -= 1;
44            } else {                            /* x < y, x += ulp */
45                hx += 1;
46            }
47        } else {                                /* x < 0 */
48            if(hy>=0||hx>hy){                   /* x < y, x -= ulp */
49                hx -= 1;
50            } else {                            /* x > y, x += ulp */
51                hx += 1;
52            }
53        }
54        hy = hx&0x7f800000;
55        if(hy>FLT_UWORD_MAX) return x+x;        /* overflow  */
56        if(hy<0x00800000) {             /* underflow */
57            y = x*x;
58            if(y!=x) {          /* raise underflow flag */
59                SET_FLOAT_WORD(y,hx);
60                return y;
61            }
62        }
63        SET_FLOAT_WORD(x,hx);
64        return x;
65}
66
67#ifdef _DOUBLE_IS_32BITS
68
69#ifdef __STDC__
70        double nextafter(double x, double y)
71#else
72        double nextafter(x,y)
73        double x,y;
74#endif
75{
76        return (double) nextafterf((float) x, (float) x);
77}
78
79#endif /* defined(_DOUBLE_IS_32BITS) */
Note: See TracBrowser for help on using the repository browser.