* Copyright (c) 1985 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* All recipients should regard themselves as participants in an ongoing
* research project and hence should feel obligated to report their
* experiences (good or bad) with these elementary function codes, using
* the sendbug(8) program, to the authors.
static char sccsid
[] = "@(#)floor.c 5.4 (Berkeley) 6/30/88";
#if defined(vax)||defined(tahoe)
#define _0x(A,B) 0x/**/A/**/B
#define _0x(A,B) 0x/**/B/**/A
static long Lx
[] = {_0x(0000,5c00
),_0x(0000,0000)}; /* 2**55 */
#else /* defined(vax)||defined(tahoe) */
static double L
= 4503599627370496.0E0
; /* 2**52 */
#endif /* defined(vax)||defined(tahoe) */
* floor(x) := the largest integer no larger than x;
* ceil(x) := -floor(-x), for all real x.
* Note: Inexact will be signaled if x is not an integer, as is
* customary for IEEE 754. No other signal can be emitted.
#if !defined(vax)&&!defined(tahoe)
#endif /* !defined(vax)&&!defined(tahoe) */
x
>= L
) /* already an even integer */
else { /* now 0 <= x < L */
y
= L
+x
; /* destructive store must be forced */
y
-= L
; /* an integer, and |x-y| < 1 */
return x
< y
? y
-(double)1 : y
;
#if !defined(vax)&&!defined(tahoe)
#endif /* !defined(vax)&&!defined(tahoe) */
x
>= L
) /* already an even integer */
else { /* now 0 <= x < L */
y
= L
+x
; /* destructive store must be forced */
y
-= L
; /* an integer, and |x-y| < 1 */
return x
> y
? y
+(double)1 : y
;
#ifndef national /* rint() is in ./NATIONAL/support.s */
* algorithm for rint(x) in pseudo-pascal form ...
* ... delivers integer nearest x in direction of prevailing rounding
* const L = (last consecutive integer)/2
* = 2**52; for IEEE 754 Double
* if x != x then return x; ... NaN
* if |x| >= L then return x; ... already an integer
* t := x + s; ... = (x+s) rounded to integer
* Note: Inexact will be signaled if x is not an integer, as is
* customary for IEEE 754. No other signal can be emitted.
double s
,t
,one
= 1.0,copysign();
#if !defined(vax)&&!defined(tahoe)
#endif /* !defined(vax)&&!defined(tahoe) */
if (copysign(x
,one
) >= L
) /* already an integer */
t
= x
+ s
; /* x+s rounded to integer */
#endif /* not national */