On Sat, Apr 26, 2014 at 05:27:58PM -0400, Paul Bennett wrote:
> Based on the results below, which show failures only on all linux-ld perls,
> and only failures on any linux-ld perl, what would you all recommend as my
> next debugging step(s)?
>
> http://matrix.cpantesters.org/?dist=Path-Hilbert%201.001
>
> I could make more tests, and do more-verbose testing, but if the math isn't
> working (specifically 2 ** 7 != 128, or at least log(128) / log(2) != 7),
> I'm not entirely sure where I'd even start looking.
The line that is causing issues is:
2 ** int(log($n) / log(2)) == $n or confess("Side-length $n is not a power
of 2");
I'd want to see what the value of that expression is, if it doesn't equal
$n. This could be due to bad rounding in int(log($n) / log(2)).
So that either means finding a machine with the right architecture to test
on, or put out a new release with a more specific error message.
At the same time, you can get the answer to your next question in advance:
print out the result of log($n) / log(2) before you convert it to an
integer.
(Also, your error message doesn't accurately portray the problem - you're
not just checking that the expression is a power of 2 -- which it has to
be, since the last thing you do is raise 2 to the nth power), but that it
equals a specific value.)
FWIW, you can check if a number is a power of 2 much more easily, by
leveraging the fact that binary is a base 2 system:
($n & ($n - 1)) == 0 or confess("Side-length $n is not a power of 2");
*much* faster than doing floating point operations :)