mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
SF bug 705231: Assertion failed, python aborts.
float_pow(): Don't let the platform pow() raise -1.0 to an integer power anymore; at least glibc gets it wrong in some cases. Note that math.pow() will continue to deliver wrong (but platform-native) results in such cases.
This commit is contained in:
parent
0ed39577dd
commit
e87568dd9a
3 changed files with 61 additions and 6 deletions
|
@ -101,6 +101,23 @@ class PowTest(unittest.TestCase):
|
|||
return None
|
||||
None ** TestRpow() # Won't fail when __rpow__ invoked. SF bug #643260.
|
||||
|
||||
def test_bug705231(self):
|
||||
# -1.0 raised to an integer should never blow up. It did if the
|
||||
# platform pow() was buggy, and Python didn't worm around it.
|
||||
eq = self.assertEquals
|
||||
a = -1.0
|
||||
eq(pow(a, 1.23e167), 1.0)
|
||||
eq(pow(a, -1.23e167), 1.0)
|
||||
for b in range(-10, 11):
|
||||
eq(pow(a, float(b)), b & 1 and -1.0 or 1.0)
|
||||
for n in range(0, 100):
|
||||
fiveto = float(5 ** n)
|
||||
# For small n, fiveto will be odd. Eventually we run out of
|
||||
# mantissa bits, though, and thereafer fiveto will be even.
|
||||
expected = fiveto % 2.0 and -1.0 or 1.0
|
||||
eq(pow(a, fiveto), expected)
|
||||
eq(pow(a, -fiveto), expected)
|
||||
eq(expected, 1.0) # else we didn't push fiveto to evenness
|
||||
|
||||
def test_main():
|
||||
test.test_support.run_unittest(PowTest)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue