I suspect this will only mask this issue for the OP. At best, this give the OP a factor of two improvement before he hits the ceiling, and then it transforms an obvious error to a silent one. For example, the code:
printf "%020u\n%020u\n%020u\n", 9223372036854775808,20000000000000000000,99999999999999999999
outputs under 64-bit
09223372036854775808
18446744073709551615
18446744073709551615
and under 32-bit
00000000004294967295
00000000004294967295
00000000004294967295
The swapping to %020.0f puts you at the whims of round-off, with 32-bit yielding
09223372036854775800
20000000000000000000
100000000000000000000
and 64-bit yielding
09223372036854775808
20000000000000000000
100000000000000000000
That round-off might well be acceptable depending on the specific numbers involved and required accuracy; if not the OP will likely have to resort to Math::BigInt or equivalent. |