https://github.com/python/cpython/commit/99185bd6498bec3d690680c9fb7b8a938b45ae21
commit: 99185bd6498bec3d690680c9fb7b8a938b45ae21
branch: 3.13
author: Sergey B Kirpichev <[email protected]>
committer: Yhg1s <[email protected]>
date: 2024-09-29T18:14:02-07:00
summary:
[3.13] gh-123836: workaround fmod(x, y) bug on Windows (GH-124171) (#124187)
Buildbot failure on Windows 10 with MSC v.1916 64 bit (AMD64):
FAIL: testFmod (test.test_math.MathTests.testFmod)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\buildarea\3.x.bolen-windows10\build\Lib\test\test_math.py", line
605, in testFmod
self.ftest('fmod(-10, 1)', math.fmod(-10, 1), -0.0)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\buildarea\3.x.bolen-windows10\build\Lib\test\test_math.py", line
258, in ftest
self.fail("{}: {}".format(name, failure))
~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: fmod(-10, 1): expected -0.0, got 0.0 (zero has wrong sign)
Here Windows loose sign of the result; if y is nonzero, the result
should have the same sign as x.
This amends commit 28aea5d07d.
(cherry picked from commit f4dd4402108cc005d45acd4ca83c8530c36a93ca)
files:
A Misc/NEWS.d/next/Library/2024-09-17-18-06-42.gh-issue-124171.PHCvRJ.rst
M Modules/mathmodule.c
diff --git
a/Misc/NEWS.d/next/Library/2024-09-17-18-06-42.gh-issue-124171.PHCvRJ.rst
b/Misc/NEWS.d/next/Library/2024-09-17-18-06-42.gh-issue-124171.PHCvRJ.rst
new file mode 100644
index 00000000000000..c2f0bb14f55251
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-09-17-18-06-42.gh-issue-124171.PHCvRJ.rst
@@ -0,0 +1,3 @@
+Add workaround for broken :c:func:`!fmod()` implementations on Windows, that
+loose zero sign (e.g. ``fmod(-10, 1)`` returns ``0.0``). Patch by Sergey B
+Kirpichev.
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 36b17761d24f87..64a497306b2aac 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -2385,6 +2385,15 @@ math_fmod_impl(PyObject *module, double x, double y)
return PyFloat_FromDouble(x);
errno = 0;
r = fmod(x, y);
+#ifdef _MSC_VER
+ /* Windows (e.g. Windows 10 with MSC v.1916) loose sign
+ for zero result. But C99+ says: "if y is nonzero, the result
+ has the same sign as x".
+ */
+ if (r == 0.0 && y != 0.0) {
+ r = copysign(r, x);
+ }
+#endif
if (Py_IS_NAN(r)) {
if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
errno = EDOM;
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]