From a3ecd2c6689d8376dfda38e4bbd03a43a69a968a Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sat, 24 Jan 2009 16:40:29 +0000 Subject: Issue #1672332: Fix unpickling of subnormal floats, which was raising ValueError on some platforms as a result of the platform strtod setting errno on underflow. --- Lib/test/pickletester.py | 10 ++++++++++ Misc/NEWS | 3 +++ Modules/cPickle.c | 3 ++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index bd0a3a4..e34d55b 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -535,6 +535,16 @@ class AbstractPickleTests(unittest.TestCase): got = self.loads(p) self.assertEqual(n, got) + def test_float(self): + test_values = [0.0, 4.94e-324, 1e-310, 7e-308, 6.626e-34, 0.1, 0.5, + 3.14, 263.44582062374053, 6.022e23, 1e30] + test_values = test_values + [-x for x in test_values] + for proto in protocols: + for value in test_values: + pickle = self.dumps(value, proto) + got = self.loads(pickle) + self.assertEqual(value, got) + @run_with_locale('LC_ALL', 'de_DE', 'fr_FR') def test_float_format(self): # make sure that floats are formatted locale independent diff --git a/Misc/NEWS b/Misc/NEWS index 0a65732..0b5f801 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -145,6 +145,9 @@ Core and Builtins Library ------- +- Issue #1672332: fix unpickling of subnormal floats, which was + producing a ValueError on some platforms. + - Issue #3881: Help Tcl to load even when started through the unreadable local symlink to "Program Files" on Vista. diff --git a/Modules/cPickle.c b/Modules/cPickle.c index 7f836c3..fb13ba1 100644 --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -3465,7 +3465,8 @@ load_float(Unpicklerobject *self) errno = 0; d = PyOS_ascii_strtod(s, &endptr); - if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) { + if ((errno == ERANGE && !(fabs(d) <= 1.0)) || + (endptr[0] != '\n') || (endptr[1] != '\0')) { PyErr_SetString(PyExc_ValueError, "could not convert string to float"); goto finally; -- cgit v0.12