From a24e521fa7e793af3f4056c65e5b89bdb74ff492 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sun, 9 Mar 2025 17:02:48 -0400 Subject: Have floating point modulus use euclidean division --- stdlib/nums.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/stdlib/nums.c b/stdlib/nums.c index f1b7c7b7..98f7b509 100644 --- a/stdlib/nums.c +++ b/stdlib/nums.c @@ -58,8 +58,10 @@ public Text_t Num$scientific(double f, Int_t precision) { } public CONSTFUNC double Num$mod(double num, double modulus) { - double result = fmod(num, modulus); - return (result < 0) != (modulus < 0) ? result + modulus : result; + // Euclidean division, see: https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/divmodnote-letter.pdf + double r = remainder(num, modulus); + r -= (r < 0) * (2*(modulus < 0) - 1) * modulus; + return r; } public CONSTFUNC double Num$mod1(double num, double modulus) { @@ -137,8 +139,10 @@ public Text_t Num32$scientific(float f, Int_t precision) { } public CONSTFUNC float Num32$mod(float num, float modulus) { - float result = fmodf(num, modulus); - return (result < 0) != (modulus < 0) ? result + modulus : result; + // Euclidean division, see: https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/divmodnote-letter.pdf + float r = remainderf(num, modulus); + r -= (r < 0) * (2*(modulus < 0) - 1) * modulus; + return r; } public CONSTFUNC float Num32$mod1(float num, float modulus) { -- cgit v1.2.3