bpo-37942: Improve argument clinic float converter (GH-15470)

diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index 9880b39..d5863a3 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -3106,9 +3106,15 @@
     def parse_arg(self, argname, argnum):
         if self.format_unit == 'f':
             return """
-                {paramname} = (float) PyFloat_AsDouble({argname});
-                if (PyErr_Occurred()) {{{{
-                    goto exit;
+                if (PyFloat_CheckExact({argname})) {{{{
+                    {paramname} = (float) (PyFloat_AS_DOUBLE({argname}));
+                }}}}
+                else
+                {{{{
+                    {paramname} = (float) PyFloat_AsDouble({argname});
+                    if ({paramname} == -1.0 && PyErr_Occurred()) {{{{
+                        goto exit;
+                    }}}}
                 }}}}
                 """.format(argname=argname, paramname=self.name)
         return super().parse_arg(argname, argnum)
@@ -3122,9 +3128,15 @@
     def parse_arg(self, argname, argnum):
         if self.format_unit == 'd':
             return """
-                {paramname} = PyFloat_AsDouble({argname});
-                if (PyErr_Occurred()) {{{{
-                    goto exit;
+                if (PyFloat_CheckExact({argname})) {{{{
+                    {paramname} = PyFloat_AS_DOUBLE({argname});
+                }}}}
+                else
+                {{{{
+                    {paramname} = PyFloat_AsDouble({argname});
+                    if ({paramname} == -1.0 && PyErr_Occurred()) {{{{
+                        goto exit;
+                    }}}}
                 }}}}
                 """.format(argname=argname, paramname=self.name)
         return super().parse_arg(argname, argnum)