diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2024-05-22 16:33:43 +0100 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2024-06-04 15:33:26 +0100 |
commit | 2a9943b4a03b6bce7c2b1b047592eee38ab74fab (patch) | |
tree | f53f7330dc2d41137d126bf1f15f8f2a6fc68e77 | |
parent | d0106b6ae26c8cc046269358a77188105c99d5e3 (diff) | |
download | glibc-2a9943b4a03b6bce7c2b1b047592eee38ab74fab.tar.gz glibc-2a9943b4a03b6bce7c2b1b047592eee38ab74fab.tar.xz glibc-2a9943b4a03b6bce7c2b1b047592eee38ab74fab.zip |
math: Fix exp10 undefined left shift
Left shift of ki is undefined when ki<0, copy the logic from exp, which uses unsigned arithmetics, to fix it. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_exp10.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/sysdeps/ieee754/dbl-64/e_exp10.c b/sysdeps/ieee754/dbl-64/e_exp10.c index 225fc74c4c..7ea8270063 100644 --- a/sysdeps/ieee754/dbl-64/e_exp10.c +++ b/sysdeps/ieee754/dbl-64/e_exp10.c @@ -38,7 +38,7 @@ special_case (uint64_t sbits, double_t tmp, uint64_t ki) { double_t scale, y; - if (ki - (1ull << 16) < 0x80000000) + if ((ki & 0x80000000) == 0) { /* The exponent of scale might have overflowed by 1. */ sbits -= 1ull << 52; @@ -100,14 +100,14 @@ __exp10 (double x) /* Reduce x: z = x * N / log10(2), k = round(z). */ double_t z = __exp_data.invlog10_2N * x; double_t kd; - int64_t ki; + uint64_t ki; #if TOINT_INTRINSICS kd = roundtoint (z); ki = converttoint (z); #else kd = math_narrow_eval (z + Shift); + ki = asuint64 (kd); kd -= Shift; - ki = kd; #endif /* r = x - k * log10(2), r in [-0.5, 0.5]. */ |