pow
works with double
numbers. These represent numbers of the form s * 2^e where s is a 53 bit integer. Therefore double
can store all integers below 2^53, but only some integers above 2^53. In particular, it can only represent even numbers > 2^53, since for e > 0 the value is always a multiple of 2.
17^13 needs 54 bits to represent exactly, so e is set to 1 and hence the calculated value becomes even number. The correct value is odd, so it's not surprising it's off by one. Likewise, 17^14 takes 58 bits to represent. That it too is off by one is a lucky coincidence (as long as you don't apply too much number theory), it just happens to be one off from a multiple of 32, which is the granularity at which double
numbers of that magnitude are rounded.
For exact integer exponentiation, you should use integers all the way. Write your own double
-free exponentiation routine. Use exponentiation by squaring if y
can be large, but I assume it's always less than 64, making this issue moot.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…