diff --git a/Doc/c-api/concrete.rst b/Doc/c-api/concrete.rst index b6cc60e9ac2..2f4863a3d71 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 bd8480c4167..1b5eb4976f8 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 94e4eb936ec..33de4f6aaf7 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 56598146ae0..3ec5af582bb 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 020220755df..f4569abc072 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 9a285c5ebf6..767f3a803d3 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 3ef44f63955..d3b7c9efecf 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -9,6 +9,7 @@ #include "formatter_unicode.h" #include +#include #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 26ef629028b..58beaa808ff 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 1df98d4f8b6..16d16d0e980 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" />