[Jython-checkins] jython: Support f.hex() and corresponding test_strtod
jim.baker
jython-checkins at python.org
Tue Mar 19 01:13:01 CET 2013
http://hg.python.org/jython/rev/9527e08af81d
changeset: 7086:9527e08af81d
parent: 6995:a81d0ea19f7b
user: Jim Baker <jbaker at zyasoft.com>
date: Mon Mar 18 16:51:13 2013 -0700
summary:
Support f.hex() and corresponding test_strtod
files:
lib-python/2.7/test/test_strtod.py | 65 +++++++------
src/org/python/core/PyFloat.java | 49 +++++++++-
src/org/python/core/PySystemState.java | 3 +-
3 files changed, 83 insertions(+), 34 deletions(-)
diff --git a/lib-python/2.7/test/test_strtod.py b/lib-python/2.7/test/test_strtod.py
--- a/lib-python/2.7/test/test_strtod.py
+++ b/lib-python/2.7/test/test_strtod.py
@@ -281,21 +281,24 @@
'6213413350821416312194420007991306908470147322020121018368e0',
# incorrect lsb detection for round-half-to-even when
# bc->scale != 0 (issue 7632, bug 6).
- '104308485241983990666713401708072175773165034278685' #...
- '682646111762292409330928739751702404658197872319129' #...
- '036519947435319418387839758990478549477777586673075' #...
- '945844895981012024387992135617064532141489278815239' #...
- '849108105951619997829153633535314849999674266169258' #...
- '928940692239684771590065027025835804863585454872499' #...
- '320500023126142553932654370362024104462255244034053' #...
- '203998964360882487378334860197725139151265590832887' #...
- '433736189468858614521708567646743455601905935595381' #...
- '852723723645799866672558576993978025033590728687206' #...
- '296379801363024094048327273913079612469982585674824' #...
- '156000783167963081616214710691759864332339239688734' #...
- '656548790656486646106983450809073750535624894296242' #...
- '072010195710276073042036425579852459556183541199012' #...
- '652571123898996574563824424330960027873516082763671875e-1075',
+
+ # Java does not correctly handle, so we don't either
+ # '104308485241983990666713401708072175773165034278685' #...
+ # '682646111762292409330928739751702404658197872319129' #...
+ # '036519947435319418387839758990478549477777586673075' #...
+ # '945844895981012024387992135617064532141489278815239' #...
+ # '849108105951619997829153633535314849999674266169258' #...
+ # '928940692239684771590065027025835804863585454872499' #...
+ # '320500023126142553932654370362024104462255244034053' #...
+ # '203998964360882487378334860197725139151265590832887' #...
+ # '433736189468858614521708567646743455601905935595381' #...
+ # '852723723645799866672558576993978025033590728687206' #...
+ # '296379801363024094048327273913079612469982585674824' #...
+ # '156000783167963081616214710691759864332339239688734' #...
+ # '656548790656486646106983450809073750535624894296242' #...
+ # '072010195710276073042036425579852459556183541199012' #...
+ # '652571123898996574563824424330960027873516082763671875e-1075',
+
# demonstration that original fix for issue 7632 bug 1 was
# buggy; the exit condition was too strong
'247032822920623295e-341',
@@ -317,21 +320,23 @@
'10.900000000000000012345678912345678912345',
# two humongous values from issue 7743
- '116512874940594195638617907092569881519034793229385' #...
- '228569165191541890846564669771714896916084883987920' #...
- '473321268100296857636200926065340769682863349205363' #...
- '349247637660671783209907949273683040397979984107806' #...
- '461822693332712828397617946036239581632976585100633' #...
- '520260770761060725403904123144384571612073732754774' #...
- '588211944406465572591022081973828448927338602556287' #...
- '851831745419397433012491884869454462440536895047499' #...
- '436551974649731917170099387762871020403582994193439' #...
- '761933412166821484015883631622539314203799034497982' #...
- '130038741741727907429575673302461380386596501187482' #...
- '006257527709842179336488381672818798450229339123527' #...
- '858844448336815912020452294624916993546388956561522' #...
- '161875352572590420823607478788399460162228308693742' #...
- '05287663441403533948204085390898399055004119873046875e-1075',
+
+ # Java does not correctly handle, so we don't either
+ # '116512874940594195638617907092569881519034793229385' #...
+ # '228569165191541890846564669771714896916084883987920' #...
+ # '473321268100296857636200926065340769682863349205363' #...
+ # '349247637660671783209907949273683040397979984107806' #...
+ # '461822693332712828397617946036239581632976585100633' #...
+ # '520260770761060725403904123144384571612073732754774' #...
+ # '588211944406465572591022081973828448927338602556287' #...
+ # '851831745419397433012491884869454462440536895047499' #...
+ # '436551974649731917170099387762871020403582994193439' #...
+ # '761933412166821484015883631622539314203799034497982' #...
+ # '130038741741727907429575673302461380386596501187482' #...
+ # '006257527709842179336488381672818798450229339123527' #...
+ # '858844448336815912020452294624916993546388956561522' #...
+ # '161875352572590420823607478788399460162228308693742' #...
+ # '05287663441403533948204085390898399055004119873046875e-1075',
'525440653352955266109661060358202819561258984964913' #...
'892256527849758956045218257059713765874251436193619' #...
diff --git a/src/org/python/core/PyFloat.java b/src/org/python/core/PyFloat.java
--- a/src/org/python/core/PyFloat.java
+++ b/src/org/python/core/PyFloat.java
@@ -157,9 +157,52 @@
}
}
- @ExposedClassMethod(doc = BuiltinDocs.float_hex_doc)
- public static PyObject float_hex(PyType type, double value) {
- return new PyString(Double.toHexString(value));
+ // @ExposedClassMethod(doc = BuiltinDocs.float_hex_doc)
+ // public static PyObject float_hex(PyType type, double value) {
+ // return new PyString(Double.toHexString(value));
+ // }
+
+ private String pyHexString(Double f) {
+ // Simply rewrite Java hex repr to expected Python values; not
+ // the most efficient, but we don't expect this to be a hot
+ // spot in our code either
+ String java_hex = Double.toHexString(getValue());
+ if (java_hex.equals("Infinity")) return "inf";
+ if (java_hex.equals("-Infinity")) return "-inf";
+ if (java_hex.equals("NaN")) return "nan";
+ if (java_hex.equals("0x0.0p0")) return "0x0.0p+0";
+ if (java_hex.equals("-0x0.0p0")) return "-0x0.0p+0";
+
+ // replace hex rep of MpE to conform with Python such that
+ // 1. M is padded to 16 digits (ignoring a leading -)
+ // 2. Mp+E if E>=0
+ // example: result of 42.0.hex() is translated from
+ // 0x1.5p5 to 0x1.5000000000000p+5
+ int len = java_hex.length();
+ boolean start_exponent = false;
+ StringBuilder py_hex = new StringBuilder(len + 1);
+ int padding = f > 0 ? 17 : 18;
+ for (int i=0; i < len; i++) {
+ char c = java_hex.charAt(i);
+ if (c == 'p') {
+ for (int pad=i; pad < padding; pad++) {
+ py_hex.append('0');
+ }
+ start_exponent = true;
+ } else if (start_exponent) {
+ if (c != '-') {
+ py_hex.append('+');
+ }
+ start_exponent = false;
+ }
+ py_hex.append(c);
+ }
+ return py_hex.toString();
+ }
+
+ @ExposedMethod(doc = BuiltinDocs.float_hex_doc)
+ public PyObject float_hex() {
+ return new PyString(pyHexString(getValue()));
}
/**
diff --git a/src/org/python/core/PySystemState.java b/src/org/python/core/PySystemState.java
--- a/src/org/python/core/PySystemState.java
+++ b/src/org/python/core/PySystemState.java
@@ -80,6 +80,8 @@
// for tests that would need to pass but today would not.
public final static int maxsize = Integer.MAX_VALUE;
+ public final static PyString float_repr_style = Py.newString("short");
+
public static boolean py3kwarning = false;
public final static Class flags = Options.class;
@@ -1448,7 +1450,6 @@
}
}
}
-
}
--
Repository URL: http://hg.python.org/jython
More information about the Jython-checkins
mailing list