summaryrefslogtreecommitdiffstats
path: root/Include/pyport.h
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2009-04-16 19:52:09 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2009-04-16 19:52:09 (GMT)
commitb08a53a99def3fa949643974f713b5b189e21bc7 (patch)
tree6f7663d510099fd7acfa328ae5a5c88e3eddb1a7 /Include/pyport.h
parent579b65c2d695eb468fb97568ff7d2ad9d261b2b3 (diff)
downloadcpython-b08a53a99def3fa949643974f713b5b189e21bc7.zip
cpython-b08a53a99def3fa949643974f713b5b189e21bc7.tar.gz
cpython-b08a53a99def3fa949643974f713b5b189e21bc7.tar.bz2
Issue #1580: use short float repr where possible.
- incorporate and adapt David Gay's dtoa and strtod into the Python core - on platforms where we can use Gay's code (almost all!), repr(float) is based on the shortest sequence of decimal digits that rounds correctly. - add sys.float_repr_style attribute to indicate whether we're using Gay's code or not - add autoconf magic to detect and enable SSE2 instructions on x86/gcc - slight change to repr and str: repr switches to exponential notation at 1e16 instead of 1e17, str switches at 1e11 instead of 1e12
Diffstat (limited to 'Include/pyport.h')
-rw-r--r--Include/pyport.h47
1 files changed, 47 insertions, 0 deletions
diff --git a/Include/pyport.h b/Include/pyport.h
index bf75d89..ed43569 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -465,6 +465,53 @@ extern "C" {
errno = 0; \
} while(0)
+/* The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c require that
+ the FPU is using 53-bit precision. Here are macros that force this. See
+ Python/pystrtod.c for an example of their use. */
+
+#ifdef USING_X87_FPU
+#define _Py_SET_53BIT_PRECISION_HEADER \
+ unsigned short old_387controlword, new_387controlword
+#define _Py_SET_53BIT_PRECISION_START \
+ do { \
+ old_387controlword = _Py_get_387controlword(); \
+ new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \
+ if (new_387controlword != old_387controlword) \
+ _Py_set_387controlword(new_387controlword); \
+ } while (0)
+#define _Py_SET_53BIT_PRECISION_END \
+ if (new_387controlword != old_387controlword) \
+ _Py_set_387controlword(old_387controlword)
+#else
+#define _Py_SET_53BIT_PRECISION_HEADER
+#define _Py_SET_53BIT_PRECISION_START
+#define _Py_SET_53BIT_PRECISION_END
+#endif
+
+/* If we can't guarantee 53-bit precision, don't use the code
+ in Python/dtoa.c, but fall back to standard code. This
+ means that repr of a float will be long (17 sig digits).
+
+ Realistically, there are two things that could go wrong:
+
+ (1) doubles aren't IEEE 754 doubles, or
+ (2) we're on x86 with the rounding precision set to 64-bits
+ (extended precision), and we don't know how to change
+ the rounding precision.
+ */
+
+#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \
+ !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \
+ !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754)
+#define PY_NO_SHORT_FLOAT_REPR
+#endif
+
+/* double rounding is symptomatic of use of extended precision on x86 */
+#ifdef X87_DOUBLE_ROUNDING
+#define PY_NO_SHORT_FLOAT_REPR
+#endif
+
+
/* Py_DEPRECATED(version)
* Declare a variable, type, or function deprecated.
* Usage: