Discussion:
bug#21901: bit shift wrong on maximal right shift
Zefram
2015-11-13 10:22:03 UTC
Permalink
With Guile 2.0.11:

scheme@(guile-user)> (ash 123 (ash -1 63))
$1 = 123

Correct result would of course be zero. Problem only occurs for
exactly this shift distance: one bit less produces the right answer.
Problem also occurs on Guile 1.8.8. Looking at the implementation,
the problem is attributable to the negation of the shift distance,
which in twos-complement fails to produce the expected positive result.

Note the resemblance to bug #14864, fixed in 2.0.10. This bug is of
very similar form, but is distinct. The test cases of #14864 pass for
me on the 2.0.11 that shows the problem with a 2^63 bit shift. My bug
does occur with the rnrs bitwise-arithmetic-shift-right, which was used
in #14864, as well as with ash.

-zefram
Andy Wingo
2016-06-20 16:02:50 UTC
Permalink
Post by Zefram
$1 = 123
Correct result would of course be zero. Problem only occurs for
exactly this shift distance: one bit less produces the right answer.
Problem also occurs on Guile 1.8.8. Looking at the implementation,
the problem is attributable to the negation of the shift distance,
which in twos-complement fails to produce the expected positive result.
Note the resemblance to bug #14864, fixed in 2.0.10. This bug is of
very similar form, but is distinct. The test cases of #14864 pass for
me on the 2.0.11 that shows the problem with a 2^63 bit shift. My bug
does occur with the rnrs bitwise-arithmetic-shift-right, which was used
in #14864, as well as with ash.
Fascinating, thank you! Also occurs on 2.1.3.

Andy
Mark H Weaver
2018-10-14 09:40:51 UTC
Permalink
Post by Zefram
$1 = 123
Correct result would of course be zero. Problem only occurs for
exactly this shift distance: one bit less produces the right answer.
Nice catch!

It's finally fixed in commit 1990aa916382d0afcebd5315a6d6f555949ff654 on
the stable-2.2 branch. The fix will be in Guile 2.2.5.

Thanks for the report.

Mark
Mark H Weaver
2018-10-20 22:27:07 UTC
Permalink
Post by Zefram
$1 = 123
Fixed in commit 1990aa916382d0afcebd5315a6d6f555949ff654 on the
stable-2.2 branch. Closing this bug now.

Thanks very much for finding this subtle bug.

Mark

Loading...