2 * ====================================================
3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5 * Developed at SunPro, a Sun Microsystems, Inc. business.
6 * Permission to use, copy, modify, and distribute this
7 * software is freely granted, provided that this notice
9 * ====================================================
13 * modf(double x, double *iptr)
14 * return fraction part of x, and return x's integral part in *iptr.
23 #include <math_private.h>
25 static const double one
= 1.0;
28 __modf (double x
, double *iptr
)
32 EXTRACT_WORDS (i0
, i1
, x
);
33 j0
= ((i0
>> 20) & 0x7ff) - 0x3ff; /* exponent of x */
34 if (j0
< 20) /* integer part in high x */
36 if (j0
< 0) /* |x|<1 */
38 INSERT_WORDS (*iptr
, i0
& 0x80000000, 0); /* *iptr = +-0 */
43 i
= (0x000fffff) >> j0
;
44 if (((i0
& i
) | i1
) == 0) /* x is integral */
47 INSERT_WORDS (x
, i0
& 0x80000000, 0); /* return +-0 */
52 INSERT_WORDS (*iptr
, i0
& (~i
), 0);
57 else if (__glibc_unlikely (j0
> 51)) /* no fraction part */
60 /* We must handle NaNs separately. */
61 if (j0
== 0x400 && ((i0
& 0xfffff) | i1
))
63 INSERT_WORDS (x
, i0
& 0x80000000, 0); /* return +-0 */
66 else /* fraction part in low x */
68 i
= ((u_int32_t
) (0xffffffff)) >> (j0
- 20);
69 if ((i1
& i
) == 0) /* x is integral */
72 INSERT_WORDS (x
, i0
& 0x80000000, 0); /* return +-0 */
77 INSERT_WORDS (*iptr
, i0
, i1
& (~i
));
82 weak_alias (__modf
, modf
)
84 strong_alias (__modf
, __modfl
)
85 weak_alias (__modf
, modfl
)