mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
islessequal() and islessgreater() to <math.h> for C99. - The wchar_t type is now an 'unsigned short' integer (16 bits wide). - Added PTRDIFF_MIN/PTRDIFF_MAX, WCHAR_MIN/WCHAR_MAX and WINT_MIN/WINT_MAX to <stdint.h> for C99. - Added imaxdiv() and imaxabs() for C99. - Added strtoimax() and strtoumax() for C99. - Added nextafter() and nextafterf() for C99. - Added copysign() and copysignf() for C99. - Unless I missed something, clib2 should now be functionally complete with regard to C99, except for the floating point operations covered. These are a major challenge all by themselves, and I wonder both whether they are worth the effort and how one could implement them correctly. - fflush() now consistently supports a NULL parameter, causing all streams to be flushed for which this behaviour is defined. git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14943 87f5fb63-7c3d-0410-a384-fd976d0f7a62
106 lines
3.4 KiB
C
106 lines
3.4 KiB
C
/*
|
|
* $Id: math_nextafter.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $
|
|
*
|
|
* :ts=4
|
|
*
|
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
|
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* - Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
|
* may be used to endorse or promote products derived from this
|
|
* software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
*
|
|
* PowerPC math library based in part on work by Sun Microsystems
|
|
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
|
*
|
|
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
|
* Permission to use, copy, modify, and distribute this
|
|
* software is freely granted, provided that this notice
|
|
* is preserved.
|
|
*/
|
|
|
|
#ifndef _MATH_HEADERS_H
|
|
#include "math_headers.h"
|
|
#endif /* _MATH_HEADERS_H */
|
|
|
|
/****************************************************************************/
|
|
|
|
#if defined(FLOATING_POINT_SUPPORT)
|
|
|
|
/****************************************************************************/
|
|
|
|
double
|
|
nextafter(double x,double y)
|
|
{
|
|
long hx,hy,ix,iy;
|
|
unsigned long lx,ly;
|
|
|
|
EXTRACT_WORDS(hx,lx,x);
|
|
EXTRACT_WORDS(hy,ly,y);
|
|
ix = hx&0x7fffffff; /* |x| */
|
|
iy = hy&0x7fffffff; /* |y| */
|
|
|
|
if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || /* x is nan */
|
|
((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0)) /* y is nan */
|
|
return x+y;
|
|
if(x==y) return x; /* x=y, return x */
|
|
if((ix|lx)==0) { /* x == 0 */
|
|
INSERT_WORDS(x,hy&0x80000000U,1); /* return +-minsubnormal */
|
|
y = x*x;
|
|
if(y==x) return y; else return x; /* raise underflow flag */
|
|
}
|
|
if(hx>=0) { /* x > 0 */
|
|
if(hx>hy||((hx==hy)&&(lx>ly))) { /* x > y, x -= ulp */
|
|
if(lx==0) hx -= 1;
|
|
lx -= 1;
|
|
} else { /* x < y, x += ulp */
|
|
lx += 1;
|
|
if(lx==0) hx += 1;
|
|
}
|
|
} else { /* x < 0 */
|
|
if(hy>=0||hx>hy||((hx==hy)&&(lx>ly))){/* x < y, x -= ulp */
|
|
if(lx==0) hx -= 1;
|
|
lx -= 1;
|
|
} else { /* x > y, x += ulp */
|
|
lx += 1;
|
|
if(lx==0) hx += 1;
|
|
}
|
|
}
|
|
hy = hx&0x7ff00000;
|
|
if(hy>=0x7ff00000) return x+x; /* overflow */
|
|
if(hy<0x00100000) { /* underflow */
|
|
y = x*x;
|
|
if(y!=x) { /* raise underflow flag */
|
|
INSERT_WORDS(y,hx,lx);
|
|
return y;
|
|
}
|
|
}
|
|
INSERT_WORDS(x,hx,lx);
|
|
return x;
|
|
}
|
|
|
|
/****************************************************************************/
|
|
|
|
#endif /* FLOATING_POINT_SUPPORT */
|