New submission from STINNER Victor <victor.stin...@haypocalc.com>: Attached patch adds an optional format argument to time.time(), time.clock(), time.wallclock(), time.clock_gettime() and time.clock_getres() to get the timestamp as a different format. By default, the float type is still used, but it will be possible to pass "format" to get the timestamp as a decimal.Decimal object.
Some advantages of using decimal.Decimal instead of float: - no loss of precision during conversion from base 2 to base 10 (converting the float to a string) - the resolution of the clock is stored in the Decimal object - for big number, Decimal doesn't loose precision Using Decimal is also motivated by the fact than Python 3.3 has now access to clock having a resolution of 1 nanosecond: clock_gettime(CLOCK_REALTIME). Well, it doesn't mean that the clock is accurate, but Python should not loose precision just because it uses floatting point instead of integers. About the API: I chose to add a string argument to allow maybe later to support user defined formats, or at least add new builtin formats. For example, someone proposed 128 bits float in the issue #11457. -- The internal format is: typedef struct { time_t seconds; /* floatpart can be zero */ size_t floatpart; /* divisor cannot be zero */ size_t divisor; /* log10 of the clock resoltion, the real resolution is 10^resolution, resolution is in range [-9; 0] */ int resolution; } _PyTime_t; I don't know if size_t is big enough to store any "floatpart" value: time.clock() uses a LARGE_INTEGER internally. I tested my patch on Linux 32 and 64 bits, but not yet on Windows. The internal function encoding a timestamp to Decimal caches the resolution objects (10^resolution, common clock resolutions: 10^-6, 10^-9) in a dict, and a Context object. I computed that 22 decimal digits should be enough to compute a timestamp of 10,000 years. Extract of my patch: "Use 12 decimal digits to store 10,000 years in seconds + 9 decimal digits for the floating part in nanoseconds + 1 decimal digit to round correctly" >>> str(int(3600*24*365.25*10000)) '315576000000' >>> len(str(int(3600*24*365.25*10000))) 12 -- See also the issue #11457 which is linked to this topic, but not exactly the same because it concerns a low level function (os.stat()). ---------- components: Library (Lib) files: time_decimal-2.patch keywords: patch messages: 152031 nosy: belopolsky, haypo, loewis priority: normal severity: normal status: open title: Add format argument for time.time(), time.clock(), ... to get a timestamp as a Decimal object versions: Python 3.3 Added file: http://bugs.python.org/file24330/time_decimal-2.patch _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue13882> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com