| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
There was a problem hiding this comment.
There is one extra case in this file: double_round(). We use errno here to check overflows in _Py_dg_dtoa(), but can use isinf() as well.
On one hand, dtoa.c code bundled with the CPython and we can trust errno value here. On another hand, as discussed in the issue thread, we can get some performance boost with skipping errno checks (gcc v14.2, default configure flags):
| Benchmark | ref | patch |
|---|---|---|
| round(31.4) | 1.09 us | 978 ns: 1.12x faster |
import pyperf
x = 31.4
runner = pyperf.Runner()
runner.bench_func(f"round({x})", round, x, -1)diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index 17e6a729dcd..8342dcbbd16 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -937,11 +936,10 @@ double_round(double x, int ndigits) {
buf, decpt - (int)buflen);
/* and convert the resulting string back to a double */
- errno = 0;
_Py_SET_53BIT_PRECISION_START;
rounded = _Py_dg_strtod(mybuf, NULL);
_Py_SET_53BIT_PRECISION_END;
- if (errno == ERANGE && fabs(rounded) >= 1.)
+ if (isinf(rounded))
PyErr_SetString(PyExc_OverflowError,
"rounded value too large to represent");
else
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
This PR only addresses the Objects/floatobject.c portion of the linked issue.
Buy one get one free: I believe this PR allows closing #91290