From b8cef3a2d3657cc3e244e98f9c3b7457528558ef Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Sun, 5 Apr 2020 01:32:04 -0700 Subject: LibJS: Add support for floating point modulous This change implements floating point mod based on the algorithm used in LibM's fmod() implementation. To avoid taking a dependency on LibM from LibJS I reimplemented the formula in LibJS. I've incuded some of the example MDM test cases as well. This surfaced and issue handling NaN which I've fixed as well. --- Libraries/LibJS/Runtime/Value.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'Libraries/LibJS/Runtime/Value.cpp') diff --git a/Libraries/LibJS/Runtime/Value.cpp b/Libraries/LibJS/Runtime/Value.cpp index 901558ecee..13687cb5b3 100644 --- a/Libraries/LibJS/Runtime/Value.cpp +++ b/Libraries/LibJS/Runtime/Value.cpp @@ -258,8 +258,14 @@ Value div(Value lhs, Value rhs) Value mod(Value lhs, Value rhs) { - // FIXME: It seems like JavaScript should allow modulo for doubles as well(?) - return Value(lhs.to_i32() % rhs.to_i32()); + if (lhs.to_number().is_nan() || rhs.to_number().is_nan()) + return js_nan(); + + double index = lhs.to_number().as_double(); + double period = rhs.to_number().as_double(); + double trunc = (double)(i32) (index / period); + + return Value(index - trunc * period); } Value typed_eq(Value lhs, Value rhs) -- cgit v1.2.3