Browse Source

Actually, that last revision can be simpler -- we don't need to parse strings at all, as simply entering 1e1000 as a float literal in Python will be evaluated as infinity.

kenton@google.com 16 năm trước cách đây
mục cha
commit
46ed74e8d4

+ 1 - 1
python/google/protobuf/text_format.py

@@ -45,7 +45,7 @@ __all__ = [ 'MessageToString', 'PrintMessage', 'PrintField',
 
 # Infinity and NaN are not explicitly supported by Python pre-2.6, and
 # float('inf') does not work on Windows (pre-2.6).
-_INFINITY = float('1e10000')
+_INFINITY = 1e10000    # overflows, thus will actually be infinity.
 _NAN = _INFINITY * 0
 
 

+ 8 - 8
src/google/protobuf/compiler/python/python_generator.cc

@@ -169,14 +169,14 @@ string StringifyDefaultValue(const FieldDescriptor& field) {
       double value = field.default_value_double();
       if (value == numeric_limits<double>::infinity()) {
         // Python pre-2.6 on Windows does not parse "inf" correctly.  However,
-        // parsing a number that is too big for a double will return infinity.
-        return "float('1e10000')";
+        // a numeric literal that is too big for a double will become infinity.
+        return "1e10000";
       } else if (value == -numeric_limits<double>::infinity()) {
         // See above.
-        return "float('-1e10000')";
+        return "-1e10000";
       } else if (value != value) {
         // infinity * 0 = nan
-        return "(float('1e10000') * 0)";
+        return "(1e10000 * 0)";
       } else {
         return SimpleDtoa(value);
       }
@@ -185,14 +185,14 @@ string StringifyDefaultValue(const FieldDescriptor& field) {
       float value = field.default_value_float();
       if (value == numeric_limits<float>::infinity()) {
         // Python pre-2.6 on Windows does not parse "inf" correctly.  However,
-        // parsing a number that is too big for a double will return infinity.
-        return "float('1e10000')";
+        // a numeric literal that is too big for a double will become infinity.
+        return "1e10000";
       } else if (value == -numeric_limits<float>::infinity()) {
         // See above.
-        return "float('-1e10000')";
+        return "-1e10000";
       } else if (value != value) {
         // infinity - infinity = nan
-        return "(float('1e10000') - float('1e10000'))";
+        return "(1e10000 * 0)";
       } else {
         return SimpleFtoa(value);
       }