From 05a604645d2d2f77fd5ccca51210831d167e48ac Mon Sep 17 00:00:00 2001 From: Enyby Date: Mon, 24 Dec 2018 18:30:35 +0200 Subject: [PATCH] Fix modulo for edge cases. Reference code: ``` for i,lhs in ipairs({-math.huge, -10.0, 0.0, 10.0, math.huge}) do for j,rhs in ipairs({-math.huge, -10.0, 0.0, 10.0, math.huge}) do print(lhs, rhs, lhs % rhs) end end ``` --- src/core/org/luaj/vm2/LuaDouble.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/core/org/luaj/vm2/LuaDouble.java b/src/core/org/luaj/vm2/LuaDouble.java index 02559078..53961dc2 100644 --- a/src/core/org/luaj/vm2/LuaDouble.java +++ b/src/core/org/luaj/vm2/LuaDouble.java @@ -177,7 +177,14 @@ public class LuaDouble extends LuaNumber { * @see #dmod_d(double, double) */ public static LuaValue dmod(double lhs, double rhs) { - return rhs!=0? valueOf( lhs-rhs*Math.floor(lhs/rhs) ): NAN; + if (rhs == 0 || lhs == Double.POSITIVE_INFINITY || lhs == Double.NEGATIVE_INFINITY) return NAN; + if (rhs == Double.POSITIVE_INFINITY) { + return lhs < 0 ? POSINF : valueOf(lhs); + } + if (rhs == Double.NEGATIVE_INFINITY) { + return lhs > 0 ? NEGINF : valueOf(lhs); + } + return valueOf( lhs-rhs*Math.floor(lhs/rhs) ); } /** Take modulo for double numbers according to lua math, and return a double result. @@ -188,7 +195,14 @@ public class LuaDouble extends LuaNumber { * @see #dmod(double, double) */ public static double dmod_d(double lhs, double rhs) { - return rhs!=0? lhs-rhs*Math.floor(lhs/rhs): Double.NaN; + if (rhs == 0 || lhs == Double.POSITIVE_INFINITY || lhs == Double.NEGATIVE_INFINITY) return Double.NaN; + if (rhs == Double.POSITIVE_INFINITY) { + return lhs < 0 ? Double.POSITIVE_INFINITY : lhs; + } + if (rhs == Double.NEGATIVE_INFINITY) { + return lhs > 0 ? Double.NEGATIVE_INFINITY : lhs; + } + return lhs-rhs*Math.floor(lhs/rhs); } // relational operators