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 * ====================================================
14 * Return x rounded to integral value according to the prevailing
17 * Using floating addition.
19 * Inexact flag raised if x not equal to rint(x).
24 #include <math-barriers.h>
25 #include <math_private.h>
26 #include <fenv_private.h>
27 #include <libm-alias-double.h>
28 #include <math-use-builtins.h>
31 __nearbyint (double x
)
33 #if USE_NEARBYINT_BUILTIN
34 return __builtin_nearbyint (x
);
36 /* Use generic implementation. */
39 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
40 -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
45 EXTRACT_WORDS64 (i0
, x
);
47 j0
= ((i0
>> 52) & 0x7ff) - 0x3ff;
48 if (__glibc_likely (j0
< 52))
52 libc_feholdexcept (&env
);
53 double w
= TWO52
[sx
] + math_opt_barrier (x
);
54 double t
= w
- TWO52
[sx
];
57 return copysign (t
, x
);
63 return x
+ x
; /* inf or NaN */
65 return x
; /* x is integral */
67 libc_feholdexcept (&env
);
68 double w
= TWO52
[sx
] + math_opt_barrier (x
);
69 double t
= w
- TWO52
[sx
];
73 #endif /* ! USE_NEARBYINT_BUILTIN */
75 libm_alias_double (__nearbyint
, nearbyint
)