diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2025-03-09 17:02:48 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2025-03-09 17:02:48 -0400 |
| commit | a24e521fa7e793af3f4056c65e5b89bdb74ff492 (patch) | |
| tree | 7a7b1cfa4ab9dbea38596c865a861dec59fc31e5 /stdlib | |
| parent | 50f8fdd00722662d136043e9b819a98aaf250691 (diff) | |
Have floating point modulus use euclidean division
Diffstat (limited to 'stdlib')
| -rw-r--r-- | stdlib/nums.c | 12 |
1 files 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) { |
