summaryrefslogtreecommitdiffstats
path: root/Python/pystrtod.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/pystrtod.c')
-rw-r--r--Python/pystrtod.c46
1 files changed, 13 insertions, 33 deletions
diff --git a/Python/pystrtod.c b/Python/pystrtod.c
index a50d360..d36f931 100644
--- a/Python/pystrtod.c
+++ b/Python/pystrtod.c
@@ -746,18 +746,15 @@ PyAPI_FUNC(char *) PyOS_double_to_string(double val,
PyErr_BadInternalCall();
return NULL;
}
+ /* The repr() precision (17 significant decimal digits) is the
+ minimal number that is guaranteed to have enough precision
+ so that if the number is read back in the exact same binary
+ value is recreated. This is true for IEEE floating point
+ by design, and also happens to work for all other modern
+ hardware. */
precision = 17;
format_code = 'g';
break;
- case 's': /* str format */
- /* Supplied precision is unused, must be 0. */
- if (precision != 0) {
- PyErr_BadInternalCall();
- return NULL;
- }
- precision = 12;
- format_code = 'g';
- break;
default:
PyErr_BadInternalCall();
return NULL;
@@ -889,18 +886,19 @@ static char *uc_float_strings[] = {
Arguments:
d is the double to be converted
- format_code is one of 'e', 'f', 'g', 'r' or 's'. 'e', 'f' and 'g'
- correspond to '%e', '%f' and '%g'; 'r' and 's' correspond
- to repr and str.
+ format_code is one of 'e', 'f', 'g', 'r'. 'e', 'f' and 'g'
+ correspond to '%e', '%f' and '%g'; 'r' corresponds to repr.
mode is one of '0', '2' or '3', and is completely determined by
- format_code: 'e', 'g' and 's' use mode 2; 'f' mode 3, 'r' mode 0.
+ format_code: 'e' and 'g' use mode 2; 'f' mode 3, 'r' mode 0.
precision is the desired precision
always_add_sign is nonzero if a '+' sign should be included for positive
numbers
add_dot_0_if_integer is nonzero if integers in non-exponential form
- should have ".0" added. Only applies to format codes 'r', 's', and 'g'.
+ should have ".0" added. Only applies to format codes 'r' and 'g'.
use_alt_formatting is nonzero if alternative formatting should be
- used. Only applies to format codes 'e', 'f' and 'g'.
+ used. Only applies to format codes 'e', 'f' and 'g'. For code 'g',
+ at most one of use_alt_formatting and add_dot_0_if_integer should
+ be nonzero.
type, if non-NULL, will be set to one of these constants to identify
the type of the 'd' argument:
Py_DTST_FINITE
@@ -1041,13 +1039,6 @@ format_float_short(double d, char format_code,
if (decpt <= -4 || decpt > 16)
use_exp = 1;
break;
- case 's':
- /* if we're forcing a digit after the point, convert to
- exponential format at 1e11. If not, convert at 1e12. */
- if (decpt <= -4 || decpt >
- (add_dot_0_if_integer ? precision-1 : precision))
- use_exp = 1;
- break;
default:
PyErr_BadInternalCall();
goto exit;
@@ -1220,17 +1211,6 @@ PyAPI_FUNC(char *) PyOS_double_to_string(double val,
}
break;
- /* str format */
- case 's':
- mode = 2;
- /* Supplied precision is unused, must be 0. */
- if (precision != 0) {
- PyErr_BadInternalCall();
- return NULL;
- }
- precision = 12;
- break;
-
default:
PyErr_BadInternalCall();
return NULL;