1/* Return the least floating-point number greater than X.
2 Copyright (C) 2016 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
18
19#include <math.h>
20#include <math_private.h>
21
22/* Return the least floating-point number greater than X. */
23long double
24__nextupl (long double x)
25{
26 u_int32_t hx, ix;
27 u_int32_t lx;
28 int32_t esx;
29
30 GET_LDOUBLE_WORDS (esx, hx, lx, x);
31 ix = esx & 0x7fff;
32
33 if (((ix == 0x7fff) && (((hx & 0x7fffffff) | lx) != 0))) /* x is nan. */
34 return x + x;
35 if ((ix | hx | lx) == 0)
36 return LDBL_TRUE_MIN;
37 if (esx >= 0)
38 { /* x > 0. */
39 if (isinf (x))
40 return x;
41 lx += 1;
42 if (lx == 0)
43 {
44 hx += 1;
45#if LDBL_MIN_EXP == -16381
46 if (hx == 0 || (esx == 0 && hx == 0x80000000))
47#else
48 if (hx == 0)
49#endif
50 {
51 esx += 1;
52 hx |= 0x80000000;
53 }
54 }
55 }
56 else
57 { /* x < 0. */
58 if (lx == 0)
59 {
60#if LDBL_MIN_EXP == -16381
61 if (hx <= 0x80000000 && esx != 0xffff8000)
62 {
63 esx -= 1;
64 hx = hx - 1;
65 if ((esx & 0x7fff) > 0)
66 hx |= 0x80000000;
67 }
68 else
69 hx -= 1;
70#else
71 if (ix != 0 && hx == 0x80000000)
72 hx = 0;
73 if (hx == 0)
74 esx -= 1;
75 hx -= 1;
76#endif
77 }
78 lx -= 1;
79 }
80 SET_LDOUBLE_WORDS (x, esx, hx, lx);
81 return x;
82}
83
84weak_alias (__nextupl, nextupl)
85