]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Make fractional value accumulation consistent inside and outside the loop. (GH-22315)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Sat, 19 Sep 2020 00:57:28 +0000 (17:57 -0700)
committerGitHub <noreply@github.com>
Sat, 19 Sep 2020 00:57:28 +0000 (17:57 -0700)
Modules/mathmodule.c

index ecd291ecd1b4b0241701c194c2a1bb40bfa5eb0a..935759ec671ca52ee58e1b81377a44f6b4f35fa2 100644 (file)
@@ -2550,8 +2550,7 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan)
             assert(csum + lo * lo == csum);
             frac_lo += lo * lo;
         }
-        frac += frac_lo + frac_mid;
-        h = sqrt(csum - 1.0 + frac);
+        h = sqrt(csum - 1.0 + (frac_lo + frac_mid + frac));
 
         x = h;
         t = x * T27;
@@ -2569,15 +2568,15 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan)
         assert(fabs(csum) >= fabs(x));
         oldcsum = csum;
         csum += x;
-        frac += (oldcsum - csum) + x;
+        frac_mid += (oldcsum - csum) + x;
 
         x = -lo * lo;
         assert(fabs(csum) >= fabs(x));
         oldcsum = csum;
         csum += x;
-        frac += (oldcsum - csum) + x;
+        frac_lo += (oldcsum - csum) + x;
 
-        x = csum - 1.0 + frac;
+        x = csum - 1.0 + (frac_lo + frac_mid + frac);
         return (h + x / (2.0 * h)) / scale;
     }
     /* When max_e < -1023, ldexp(1.0, -max_e) overflows.