Paul Eggert wrote:
> >               bit <<= 1;
> > -            if (bit > exp)
> > +            if (bit > uexp)
> >                 break;
> 
> This loops forever if exp == INT_MIN, which I reproduced with 
> './configure gl_cv_func_ldexp_works=no' on Fedora 38 x86-64. I fixed it 
> by installing the attached.

Uh oh, I made a change intending to fix undefined behaviour, and my new
code's behaviour was an infinite loop :( That's what I get for not adding
a unit test. Thanks for finding this!

Paolo Bonzini's algorithm was "Left-right binary, using bits"
(Algorithm 1.2.3 in [1]). Now we are at "Left-right binary"
(Algorithm 1.2.1 in [1]).

The new code not only assume two's complement, but also that
right-shift of negative 'int' works as in two's complement. ISO C 23
ยง 6.5.7 still says about  E1 >> E2 :
  "If E1 has a signed type and a negative value, the resulting value
   is implementation-defined."
Should we document this assumption in the chapter
https://www.gnu.org/software/gnulib/manual/html_node/Other-portability-assumptions.html
 ?

Bruno

[1] Henri Cohen: A course in computational algebraic number theory.
    S******* GTM, 1995




Reply via email to