diff options
author | cookedm <cookedm@localhost> | 2006-07-28 20:11:08 +0000 |
---|---|---|
committer | cookedm <cookedm@localhost> | 2006-07-28 20:11:08 +0000 |
commit | 39bd37d9ee35b8a28aa75ab5e5b0c988c48b0e87 (patch) | |
tree | 4cf2bb331c4b5e6b269ea605266fbe1d19f651e2 /numpy/lib/machar.py | |
parent | b8783285fe67338ef11ba0a40d80ce62172d8ba1 (diff) | |
download | numpy-39bd37d9ee35b8a28aa75ab5e5b0c988c48b0e87.tar.gz |
numpy.lib.machar: replace 'while 1' loops with 'for _ in max_iter'
If there are bugs in the scalar objects, the 'while 1' loops can potentially
run forever, so we make sure they only go at most 1000 times.
Diffstat (limited to 'numpy/lib/machar.py')
-rw-r--r-- | numpy/lib/machar.py | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/numpy/lib/machar.py b/numpy/lib/machar.py index 443fef83b..e66583774 100644 --- a/numpy/lib/machar.py +++ b/numpy/lib/machar.py @@ -58,6 +58,7 @@ class MachAr(object): float_to_str - convert array float to str title - description of used floating point numbers """ + max_iter = range(1000) one = float_conv(1) two = one + one zero = one - one @@ -65,41 +66,49 @@ class MachAr(object): # Do we really need to do this? Aren't they 2 and 2.0? # Determine ibeta and beta a = one - while 1: + for _ in max_iter: a = a + a temp = a + one temp1 = temp - a if any(temp1 - one != zero): break + else: + raise RuntimeError b = one - while 1: + for _ in max_iter: b = b + b temp = a + b itemp = int_conv(temp-a) if any(itemp != 0): break + else: + raise RuntimeError ibeta = itemp beta = float_conv(ibeta) # Determine it and irnd it = -1 b = one - while 1: + for _ in max_iter: it = it + 1 b = b * beta temp = b + one temp1 = temp - b if any(temp1 - one != zero): break + else: + raise RuntimeError betah = beta / two a = one - while 1: + for _ in max_iter: a = a + a temp = a + one temp1 = temp - a if any(temp1 - one != zero): break + else: + raise RuntimeError temp = a + betah irnd = 0 if any(temp-a != zero): @@ -116,7 +125,7 @@ class MachAr(object): for i in range(negep): a = a * betain b = a - while 1: + for _ in max_iter: temp = one - a if any(temp-one != zero): break @@ -126,6 +135,8 @@ class MachAr(object): if negep < 0: raise RuntimeError, "could not determine machine tolerance " \ "for 'negep', locals() -> %s" % (locals()) + else: + raise RuntimeError negep = -negep epsneg = a @@ -133,12 +144,14 @@ class MachAr(object): machep = - it - 3 a = b - while 1: + for _ in max_iter: temp = one + a if any(temp-one != zero): break a = a * beta machep = machep + 1 + else: + raise RuntimeError eps = a # Determine ngrd @@ -153,7 +166,7 @@ class MachAr(object): z = betain t = one + eps nxres = 0 - while 1: + for _ in max_iter: y = z z = y*y a = z*one # Check here for underflow @@ -165,6 +178,8 @@ class MachAr(object): break i = i + 1 k = k + k + else: + raise RuntimeError if ibeta != 10: iexp = i + 1 mx = k + k @@ -177,7 +192,7 @@ class MachAr(object): mx = iz + iz - 1 # Determine minexp and xmin - while 1: + for _ in max_iter: xmin = y y = y * betain a = y * one @@ -191,6 +206,8 @@ class MachAr(object): break else: break + else: + raise RuntimeError minexp = -k # Determine maxexp, xmax |