* Copyright (c) 1985 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)floor.c 5.2 (Berkeley) %G%";
* floor and ceil-- greatest integer <= arg
#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.
#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) */
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 */