12116Sjkh/* s_nextafterf.c -- float version of s_nextafter.c. 22116Sjkh * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 32116Sjkh */ 42116Sjkh 52116Sjkh/* 62116Sjkh * ==================================================== 72116Sjkh * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 82116Sjkh * 92116Sjkh * Developed at SunPro, a Sun Microsystems, Inc. business. 102116Sjkh * Permission to use, copy, modify, and distribute this 118870Srgrimes * software is freely granted, provided that this notice 122116Sjkh * is preserved. 132116Sjkh * ==================================================== 142116Sjkh */ 152116Sjkh 16176451Sdas#include <sys/cdefs.h> 17176451Sdas__FBSDID("$FreeBSD$"); 182116Sjkh 192116Sjkh#include "math.h" 202116Sjkh#include "math_private.h" 212116Sjkh 2297413Salfredfloat 2397413Salfrednextafterf(float x, float y) 242116Sjkh{ 25143216Sdas volatile float t; 262116Sjkh int32_t hx,hy,ix,iy; 272116Sjkh 282116Sjkh GET_FLOAT_WORD(hx,x); 292116Sjkh GET_FLOAT_WORD(hy,y); 302116Sjkh ix = hx&0x7fffffff; /* |x| */ 312116Sjkh iy = hy&0x7fffffff; /* |y| */ 322116Sjkh 338870Srgrimes if((ix>0x7f800000) || /* x is nan */ 348870Srgrimes (iy>0x7f800000)) /* y is nan */ 358870Srgrimes return x+y; 36140685Sdas if(x==y) return y; /* x=y, return y */ 372116Sjkh if(ix==0) { /* x == 0 */ 382116Sjkh SET_FLOAT_WORD(x,(hy&0x80000000)|1);/* return +-minsubnormal */ 39143216Sdas t = x*x; 40143216Sdas if(t==x) return t; else return x; /* raise underflow flag */ 418870Srgrimes } 422116Sjkh if(hx>=0) { /* x > 0 */ 432116Sjkh if(hx>hy) { /* x > y, x -= ulp */ 442116Sjkh hx -= 1; 452116Sjkh } else { /* x < y, x += ulp */ 462116Sjkh hx += 1; 472116Sjkh } 482116Sjkh } else { /* x < 0 */ 492116Sjkh if(hy>=0||hx>hy){ /* x < y, x -= ulp */ 502116Sjkh hx -= 1; 512116Sjkh } else { /* x > y, x += ulp */ 522116Sjkh hx += 1; 532116Sjkh } 542116Sjkh } 552116Sjkh hy = hx&0x7f800000; 562116Sjkh if(hy>=0x7f800000) return x+x; /* overflow */ 572116Sjkh if(hy<0x00800000) { /* underflow */ 58143216Sdas t = x*x; 59143216Sdas if(t!=x) { /* raise underflow flag */ 602116Sjkh SET_FLOAT_WORD(y,hx); 612116Sjkh return y; 622116Sjkh } 632116Sjkh } 642116Sjkh SET_FLOAT_WORD(x,hx); 652116Sjkh return x; 662116Sjkh} 67