[pypy-svn] r13773 - in pypy/dist/pypy/objspace/std: . test
arigo at codespeak.net
arigo at codespeak.net
Fri Jun 24 13:06:22 CEST 2005
Author: arigo
Date: Fri Jun 24 13:06:19 2005
New Revision: 13773
Modified:
pypy/dist/pypy/objspace/std/strutil.py
pypy/dist/pypy/objspace/std/test/test_strutil.py
Log:
Trivial bug fixes in string_to_float().
Tests.
Modified: pypy/dist/pypy/objspace/std/strutil.py
==============================================================================
--- pypy/dist/pypy/objspace/std/strutil.py (original)
+++ pypy/dist/pypy/objspace/std/strutil.py Fri Jun 24 13:06:19 2005
@@ -187,7 +187,7 @@
def string_to_float(s):
- s = strip_space(s)
+ s = strip_spaces(s)
if not s:
raise ParseStringError("empty string for float()")
@@ -210,12 +210,13 @@
while i < len(after_point):
d = float(ord(after_point[i]) - ord('0'))
r += d * (10.0 ** (-i-1))
+ i += 1
if exponent:
- e = string_to_int(None, exponent)
+ e = string_to_int(exponent)
r *= 10.0 ** e
- return r
-
+ if sign == '-':
+ r = -r
-
+ return r
Modified: pypy/dist/pypy/objspace/std/test/test_strutil.py
==============================================================================
--- pypy/dist/pypy/objspace/std/test/test_strutil.py (original)
+++ pypy/dist/pypy/objspace/std/test/test_strutil.py Fri Jun 24 13:06:19 2005
@@ -1,4 +1,5 @@
import autopath
+import py, random
from pypy.objspace.std.strutil import *
import py
@@ -146,3 +147,44 @@
assert break_up_float('e1') == ('', '', '', '1')
py.test.raises(ParseStringError, break_up_float, 'e')
+
+
+def test_string_to_float():
+ assert string_to_float('0') == 0.0
+ assert string_to_float('1') == 1.0
+ assert string_to_float('-1.5') == -1.5
+ assert string_to_float('1.5E2') == 150.0
+ assert string_to_float('2.5E-1') == 0.25
+
+ valid_parts = [['', ' ', ' \f\n\r\t\v'],
+ ['', '+', '-'],
+ ['00', '90', '.5', '2.4', '3.', '0.07',
+ '12.3489749871982471987198371293717398256187563298638726'
+ '2187362820947193247129871083561249818451804287437824015'
+ '013816418758104762348932657836583048761487632840726386'],
+ ['', 'e0', 'E+1', 'E-01', 'E42'],
+ ['', ' ', ' \f\n\r\t\v'],
+ ]
+ invalid_parts = [['#'],
+ ['++', '+-', '-+', '--'],
+ ['', '1.2.3', '.', '5..6'],
+ ['E+', 'E-', 'e', 'e++', 'E++2'],
+ ['#'],
+ ]
+ for part0 in valid_parts[0]:
+ for part1 in valid_parts[1]:
+ for part2 in valid_parts[2]:
+ for part3 in valid_parts[3]:
+ for part4 in valid_parts[4]:
+ s = part0+part1+part2+part3+part4
+ assert (abs(string_to_float(s) - float(s)) <=
+ 1E-13 * abs(float(s)))
+
+ for j in range(len(invalid_parts)):
+ for invalid in invalid_parts[j]:
+ for i in range(20):
+ parts = [random.choice(lst) for lst in valid_parts]
+ parts[j] = invalid
+ s = ''.join(parts)
+ print repr(s)
+ py.test.raises(ParseStringError, string_to_float, s)
More information about the Pypy-commit
mailing list