Fast path for exact floats in math.hypot() and math.dist() (GH-8949)
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 2d483af..62d3279 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -2134,14 +2134,22 @@
}
for (i=0 ; i<n ; i++) {
item = PyTuple_GET_ITEM(p, i);
- px = PyFloat_AsDouble(item);
- if (px == -1.0 && PyErr_Occurred()) {
- goto error_exit;
+ if (PyFloat_CheckExact(item)) {
+ px = PyFloat_AS_DOUBLE(item);
+ } else {
+ px = PyFloat_AsDouble(item);
+ if (px == -1.0 && PyErr_Occurred()) {
+ goto error_exit;
+ }
}
item = PyTuple_GET_ITEM(q, i);
- qx = PyFloat_AsDouble(item);
- if (qx == -1.0 && PyErr_Occurred()) {
- goto error_exit;
+ if (PyFloat_CheckExact(item)) {
+ qx = PyFloat_AS_DOUBLE(item);
+ } else {
+ qx = PyFloat_AsDouble(item);
+ if (qx == -1.0 && PyErr_Occurred()) {
+ goto error_exit;
+ }
}
x = fabs(px - qx);
diffs[i] = x;
@@ -2183,9 +2191,13 @@
}
for (i=0 ; i<n ; i++) {
item = PyTuple_GET_ITEM(args, i);
- x = PyFloat_AsDouble(item);
- if (x == -1.0 && PyErr_Occurred()) {
- goto error_exit;
+ if (PyFloat_CheckExact(item)) {
+ x = PyFloat_AS_DOUBLE(item);
+ } else {
+ x = PyFloat_AsDouble(item);
+ if (x == -1.0 && PyErr_Occurred()) {
+ goto error_exit;
+ }
}
x = fabs(x);
coordinates[i] = x;