summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/c-api/concrete.rst17
-rw-r--r--Doc/library/os.rst20
-rw-r--r--Doc/library/sys.rst42
-rw-r--r--Include/floatobject.h4
-rwxr-xr-xLib/test/regrtest.py10
-rw-r--r--Lib/test/test_sys.py2
-rw-r--r--Objects/floatobject.c47
-rw-r--r--PC/pyconfig.h4
-rw-r--r--PCbuild9/pythoncore.vcproj16
-rw-r--r--Python/sysmodule.c2
10 files changed, 144 insertions, 20 deletions
diff --git a/Doc/c-api/concrete.rst b/Doc/c-api/concrete.rst
index b6cc60e..2f4863a 100644
--- a/Doc/c-api/concrete.rst
+++ b/Doc/c-api/concrete.rst
@@ -499,6 +499,23 @@ Floating Point Objects
without error checking.
+.. cfunction:: PyObject* PyFloat_GetInfo(void)
+
+ Return a :ctype:`PyDictObject` object which contains information about the
+ precision, minimum and maximum values of a float. It's a thin wrapper
+ around the header file :file:`float.h`.
+
+
+.. cfunction:: double PyFloat_GetMax(void)
+
+ Return the maximum representable finite float *DBL_MAX* as C :ctype:`double`.
+
+
+.. cfunction:: double PyFloat_GetMin(void)
+
+ Return the minimum normalized positive float *DBL_MIN* as C :ctype:`double`.
+
+
.. _complexobjects:
Complex Number Objects
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index bd8480c..1b5eb49 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -422,6 +422,8 @@ by file descriptors.
Change the mode of the file given by *fd* to the numeric *mode*. See the docs
for :func:`chmod` for possible values of *mode*. Availability: Unix.
+ .. versionadded:: 2.6
+
.. function:: fchown(fd, uid, gid)
@@ -429,6 +431,8 @@ by file descriptors.
and *gid*. To leave one of the ids unchanged, set it to -1.
Availability: Unix.
+ .. versionadded:: 2.6
+
.. function:: fdatasync(fd)
@@ -488,13 +492,6 @@ by file descriptors.
tty(-like) device, else ``False``. Availability: Macintosh, Unix.
-.. function:: lchmod(path, mode)
-
- Change the mode of *path* to the numeric *mode*. If path is a symlink, this
- affects the symlink rather than the target. See the docs for :func:`chmod`
- for possible values of *mode*. Availability: Unix.
-
-
.. function:: lseek(fd, pos, how)
Set the current position of file descriptor *fd* to position *pos*, modified by
@@ -800,6 +797,15 @@ Files and Directories
follow symbolic links. Availability: Unix.
+.. function:: lchmod(path, mode)
+
+ Change the mode of *path* to the numeric *mode*. If path is a symlink, this
+ affects the symlink rather than the target. See the docs for :func:`chmod`
+ for possible values of *mode*. Availability: Unix.
+
+ .. versionadded:: 2.6
+
+
.. function:: lchown(path, uid, gid)
Change the owner and group id of *path* to the numeric *uid* and gid. This
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index 94e4eb9..33de4f6 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -184,6 +184,48 @@ always available.
error occurs.
+.. data:: float_info
+
+ A dict holding information about the float type. It contains low level
+ information about the precision and internal representation. Please study
+ your system's :file:`float.h` for more information.
+
+ +---------------------+--------------------------------------------------+
+ | key | explanation |
+ +=====================+==================================================+
+ | :const:`epsilon` | Difference between 1 and the next representable |
+ | | floating point number |
+ +---------------------+--------------------------------------------------+
+ | :const:`dig` | digits (see :file:`float.h`) |
+ +---------------------+--------------------------------------------------+
+ | :const:`mant_dig` | mantissa digits (see :file:`float.h`) |
+ +---------------------+--------------------------------------------------+
+ | :const:`max` | maximum representable finite float |
+ +---------------------+--------------------------------------------------+
+ | :const:`max_exp` | maximum int e such that radix**(e-1) is in the |
+ | | range of finite representable floats |
+ +---------------------+--------------------------------------------------+
+ | :const:`max_10_exp` | maximum int e such that 10**e is in the |
+ | | range of finite representable floats |
+ +---------------------+--------------------------------------------------+
+ | :const:`min` | Minimum positive normalizer float |
+ +---------------------+--------------------------------------------------+
+ | :const:`min_exp` | minimum int e such that radix**(e-1) is a |
+ | | normalized float |
+ +---------------------+--------------------------------------------------+
+ | :const:`min_10_exp` | minimum int e such that 10**e is a normalized |
+ | | float |
+ +---------------------+--------------------------------------------------+
+ | :const:`radix` | radix of exponent |
+ +---------------------+--------------------------------------------------+
+ | :const:`rounds` | addition rounds (see :file:`float.h`) |
+ +---------------------+--------------------------------------------------+
+
+ .. note::
+
+ The information in the table is simplified.
+
+
.. function:: getcheckinterval()
Return the interpreter's "check interval"; see :func:`setcheckinterval`.
diff --git a/Include/floatobject.h b/Include/floatobject.h
index 5659814..3ec5af5 100644
--- a/Include/floatobject.h
+++ b/Include/floatobject.h
@@ -21,6 +21,10 @@ PyAPI_DATA(PyTypeObject) PyFloat_Type;
#define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type)
#define PyFloat_CheckExact(op) (Py_Type(op) == &PyFloat_Type)
+PyAPI_FUNC(double) PyFloat_GetMax(void);
+PyAPI_FUNC(double) PyFloat_GetMin(void);
+PyAPI_FUNC(PyObject *) PyFloat_GetInfo(void);
+
/* Return Python float from string PyObject. */
PyAPI_FUNC(PyObject *) PyFloat_FromString(PyObject*);
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index 0202207..f4569ab 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -699,10 +699,12 @@ def dash_R(the_module, test, indirect_test, huntrleaks):
fs = warnings.filters[:]
ps = copy_reg.dispatch_table.copy()
pic = sys.path_importer_cache.copy()
- abcs = {obj: obj._abc_registry.copy()
- for abc in [getattr(_abcoll, a) for a in _abcoll.__all__
- if issubclass(getattr(_abcoll, a), _Abstract)]
- for obj in abc.__subclasses__() + [abc]}
+ abcs = {}
+ for abc in [getattr(_abcoll, a) for a in _abcoll.__all__]:
+ if not isinstance(abc, _Abstract):
+ continue
+ for obj in abc.__subclasses__() + [abc]:
+ abcs[obj] = obj._abc_registry.copy()
if indirect_test:
def run_the_test():
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
index 9a285c5..767f3a8 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -279,6 +279,8 @@ class SysModuleTest(unittest.TestCase):
self.assert_(isinstance(sys.copyright, str))
self.assert_(isinstance(sys.exec_prefix, str))
self.assert_(isinstance(sys.executable, str))
+ self.assert_(isinstance(sys.float_info, dict))
+ self.assertEqual(len(sys.float_info), 11)
self.assert_(isinstance(sys.hexversion, int))
self.assert_(isinstance(sys.maxint, int))
self.assert_(isinstance(sys.maxunicode, int))
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index 3ef44f6..d3b7c9e 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -9,6 +9,7 @@
#include "formatter_unicode.h"
#include <ctype.h>
+#include <float.h>
#if !defined(__STDC__)
extern double fmod(double, double);
@@ -48,6 +49,52 @@ fill_free_list(void)
return p + N_FLOATOBJECTS - 1;
}
+double
+PyFloat_GetMax(void)
+{
+ return DBL_MAX;
+}
+
+double
+PyFloat_GetMin(void)
+{
+ return DBL_MIN;
+}
+
+PyObject *
+PyFloat_GetInfo(void)
+{
+ PyObject *d, *tmp;
+
+#define SET_FLOAT_CONST(d, key, const) \
+ tmp = PyFloat_FromDouble(const); \
+ if (tmp == NULL) return NULL; \
+ if (PyDict_SetItemString(d, key, tmp)) return NULL; \
+ Py_DECREF(tmp)
+#define SET_INT_CONST(d, key, const) \
+ tmp = PyInt_FromLong(const); \
+ if (tmp == NULL) return NULL; \
+ if (PyDict_SetItemString(d, key, tmp)) return NULL; \
+ Py_DECREF(tmp)
+
+ d = PyDict_New();
+
+ SET_FLOAT_CONST(d, "max", DBL_MAX);
+ SET_INT_CONST(d, "max_exp", DBL_MAX_EXP);
+ SET_INT_CONST(d, "max_10_exp", DBL_MAX_10_EXP);
+ SET_FLOAT_CONST(d, "min", DBL_MIN);
+ SET_INT_CONST(d, "min_exp", DBL_MIN_EXP);
+ SET_INT_CONST(d, "min_10_exp", DBL_MIN_10_EXP);
+ SET_INT_CONST(d, "dig", DBL_DIG);
+ SET_INT_CONST(d, "mant_dig", DBL_MANT_DIG);
+ SET_FLOAT_CONST(d, "epsilon", DBL_EPSILON);
+ SET_INT_CONST(d, "radix", FLT_RADIX);
+ SET_INT_CONST(d, "rounds", FLT_ROUNDS);
+
+ return d;
+}
+
+
PyObject *
PyFloat_FromDouble(double fval)
{
diff --git a/PC/pyconfig.h b/PC/pyconfig.h
index 26ef629..58beaa8 100644
--- a/PC/pyconfig.h
+++ b/PC/pyconfig.h
@@ -23,9 +23,11 @@ compiler specific". Therefore, these should be very rare.
NOTE: The following symbols are deprecated:
-NT, WIN32, USE_DL_EXPORT, USE_DL_IMPORT, DL_EXPORT, DL_IMPORT
+NT, USE_DL_EXPORT, USE_DL_IMPORT, DL_EXPORT, DL_IMPORT
MS_CORE_DLL.
+WIN32 is still required for the locale module.
+
*/
#ifdef _WIN32_WCE
diff --git a/PCbuild9/pythoncore.vcproj b/PCbuild9/pythoncore.vcproj
index 1df98d4..16d16d0 100644
--- a/PCbuild9/pythoncore.vcproj
+++ b/PCbuild9/pythoncore.vcproj
@@ -44,7 +44,7 @@
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
- PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED"
+ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
<Tool
@@ -119,7 +119,7 @@
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
- PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED"
+ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
<Tool
@@ -197,7 +197,7 @@
InlineFunctionExpansion="0"
EnableIntrinsicFunctions="false"
AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
- PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED"
+ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="3"
/>
<Tool
@@ -275,7 +275,7 @@
InlineFunctionExpansion="0"
EnableIntrinsicFunctions="false"
AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
- PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED"
+ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="3"
/>
<Tool
@@ -349,7 +349,7 @@
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
- PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED"
+ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
<Tool
@@ -424,7 +424,7 @@
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
- PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED"
+ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
<Tool
@@ -499,7 +499,7 @@
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
- PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED"
+ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
<Tool
@@ -574,7 +574,7 @@
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
- PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED"
+ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
<Tool
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 2fcba54..6f68e00 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -1082,6 +1082,8 @@ _PySys_Init(void)
PyInt_FromLong(PyInt_GetMax()));
SET_SYS_FROM_STRING("maxsize",
PyInt_FromSsize_t(PY_SSIZE_T_MAX));
+ SET_SYS_FROM_STRING("float_info",
+ PyFloat_GetInfo());
SET_SYS_FROM_STRING("maxunicode",
PyInt_FromLong(PyUnicode_GetMax()));
SET_SYS_FROM_STRING("builtin_module_names",