13a8617a8SJordan K. Hubbard /* s_nextafterf.c -- float version of s_nextafter.c. 23a8617a8SJordan K. Hubbard * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 33a8617a8SJordan K. Hubbard */ 43a8617a8SJordan K. Hubbard 53a8617a8SJordan K. Hubbard /* 63a8617a8SJordan K. Hubbard * ==================================================== 73a8617a8SJordan K. Hubbard * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 83a8617a8SJordan K. Hubbard * 93a8617a8SJordan K. Hubbard * Developed at SunPro, a Sun Microsystems, Inc. business. 103a8617a8SJordan K. Hubbard * Permission to use, copy, modify, and distribute this 113a8617a8SJordan K. Hubbard * software is freely granted, provided that this notice 123a8617a8SJordan K. Hubbard * is preserved. 133a8617a8SJordan K. Hubbard * ==================================================== 143a8617a8SJordan K. Hubbard */ 153a8617a8SJordan K. Hubbard 163a8617a8SJordan K. Hubbard #ifndef lint 173a8617a8SJordan K. Hubbard static char rcsid[] = "$Id: s_nextafterf.c,v 1.2 1994/08/18 23:07:15 jtc Exp $"; 183a8617a8SJordan K. Hubbard #endif 193a8617a8SJordan K. Hubbard 203a8617a8SJordan K. Hubbard #include "math.h" 213a8617a8SJordan K. Hubbard #include "math_private.h" 223a8617a8SJordan K. Hubbard 233a8617a8SJordan K. Hubbard #ifdef __STDC__ 243a8617a8SJordan K. Hubbard float nextafterf(float x, float y) 253a8617a8SJordan K. Hubbard #else 263a8617a8SJordan K. Hubbard float nextafterf(x,y) 273a8617a8SJordan K. Hubbard float x,y; 283a8617a8SJordan K. Hubbard #endif 293a8617a8SJordan K. Hubbard { 303a8617a8SJordan K. Hubbard int32_t hx,hy,ix,iy; 313a8617a8SJordan K. Hubbard 323a8617a8SJordan K. Hubbard GET_FLOAT_WORD(hx,x); 333a8617a8SJordan K. Hubbard GET_FLOAT_WORD(hy,y); 343a8617a8SJordan K. Hubbard ix = hx&0x7fffffff; /* |x| */ 353a8617a8SJordan K. Hubbard iy = hy&0x7fffffff; /* |y| */ 363a8617a8SJordan K. Hubbard 373a8617a8SJordan K. Hubbard if((ix>0x7f800000) || /* x is nan */ 383a8617a8SJordan K. Hubbard (iy>0x7f800000)) /* y is nan */ 393a8617a8SJordan K. Hubbard return x+y; 403a8617a8SJordan K. Hubbard if(x==y) return x; /* x=y, return x */ 413a8617a8SJordan K. Hubbard if(ix==0) { /* x == 0 */ 423a8617a8SJordan K. Hubbard SET_FLOAT_WORD(x,(hy&0x80000000)|1);/* return +-minsubnormal */ 433a8617a8SJordan K. Hubbard y = x*x; 443a8617a8SJordan K. Hubbard if(y==x) return y; else return x; /* raise underflow flag */ 453a8617a8SJordan K. Hubbard } 463a8617a8SJordan K. Hubbard if(hx>=0) { /* x > 0 */ 473a8617a8SJordan K. Hubbard if(hx>hy) { /* x > y, x -= ulp */ 483a8617a8SJordan K. Hubbard hx -= 1; 493a8617a8SJordan K. Hubbard } else { /* x < y, x += ulp */ 503a8617a8SJordan K. Hubbard hx += 1; 513a8617a8SJordan K. Hubbard } 523a8617a8SJordan K. Hubbard } else { /* x < 0 */ 533a8617a8SJordan K. Hubbard if(hy>=0||hx>hy){ /* x < y, x -= ulp */ 543a8617a8SJordan K. Hubbard hx -= 1; 553a8617a8SJordan K. Hubbard } else { /* x > y, x += ulp */ 563a8617a8SJordan K. Hubbard hx += 1; 573a8617a8SJordan K. Hubbard } 583a8617a8SJordan K. Hubbard } 593a8617a8SJordan K. Hubbard hy = hx&0x7f800000; 603a8617a8SJordan K. Hubbard if(hy>=0x7f800000) return x+x; /* overflow */ 613a8617a8SJordan K. Hubbard if(hy<0x00800000) { /* underflow */ 623a8617a8SJordan K. Hubbard y = x*x; 633a8617a8SJordan K. Hubbard if(y!=x) { /* raise underflow flag */ 643a8617a8SJordan K. Hubbard SET_FLOAT_WORD(y,hx); 653a8617a8SJordan K. Hubbard return y; 663a8617a8SJordan K. Hubbard } 673a8617a8SJordan K. Hubbard } 683a8617a8SJordan K. Hubbard SET_FLOAT_WORD(x,hx); 693a8617a8SJordan K. Hubbard return x; 703a8617a8SJordan K. Hubbard } 71