From 6fa624424bd9a73a8c21607837f4407191171a8c Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Mon, 30 Sep 2024 05:56:05 -0700 Subject: [PATCH 1/3] Adds modulo operator --- .../squiggle-lang/__tests__/library/number_test.ts | 7 +++++++ packages/squiggle-lang/src/fr/number.ts | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/packages/squiggle-lang/__tests__/library/number_test.ts b/packages/squiggle-lang/__tests__/library/number_test.ts index 65169242c5..59a4389d99 100644 --- a/packages/squiggle-lang/__tests__/library/number_test.ts +++ b/packages/squiggle-lang/__tests__/library/number_test.ts @@ -34,4 +34,11 @@ describe("Numbers", () => { testEvalToBe("Number.cumprod([1,5,3])", "[1,5,15]"); testEvalToBe("Number.diff([1])", "[]"); testEvalToBe("Number.diff([1,5,3])", "[4,-2]"); + testEvalToBe("Number.mod(10, 3)", "1"); + testEvalToBe("mod(10, 3)", "1"); + testEvalToBe("Number.mod(15, 4)", "3"); + testEvalToBe("mod(-10, 3)", "2"); + testEvalToBe("mod(-5, 3)", "1"); + testEvalToBe("mod(5, -3)", "2"); + testEvalToBe("mod(-5, -3)", "1"); }); diff --git a/packages/squiggle-lang/src/fr/number.ts b/packages/squiggle-lang/src/fr/number.ts index abe5f4db20..1e84f11db0 100644 --- a/packages/squiggle-lang/src/fr/number.ts +++ b/packages/squiggle-lang/src/fr/number.ts @@ -75,6 +75,20 @@ export const library = [ displaySection: "Algebra (Number)", fn: (x, y) => Math.pow(x, y), }), + maker.nn2n({ + name: "mod", + displaySection: "Algebra (Number)", + examples: [ + makeFnExample(`mod(10, 3)`), + makeFnExample(`mod(-10, 3)`), + makeFnExample(`mod(10, -3)`), + ], + description: + "modulo. Note that there is no '%' operator in Squiggle for this operation..", + fn: (x, y) => { + return ((x % y) + y) % y; + }, + }), maker.n2n({ name: "unaryMinus", displaySection: "Functions (Number)", From 0df66aeec3478842f115bfb40029ee1e71a1a2a4 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Mon, 30 Sep 2024 05:58:05 -0700 Subject: [PATCH 2/3] Added comment --- packages/squiggle-lang/src/fr/number.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/squiggle-lang/src/fr/number.ts b/packages/squiggle-lang/src/fr/number.ts index 1e84f11db0..7ec45acb63 100644 --- a/packages/squiggle-lang/src/fr/number.ts +++ b/packages/squiggle-lang/src/fr/number.ts @@ -86,7 +86,7 @@ export const library = [ description: "modulo. Note that there is no '%' operator in Squiggle for this operation..", fn: (x, y) => { - return ((x % y) + y) % y; + return ((x % y) + y) % y; //See: https://stackoverflow.com/questions/4467539/javascript-modulo-gives-a-negative-result-for-negative-numbers }, }), maker.n2n({ From e6a8ac49fd4b6a2992ba04f3ccd89765289e337c Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Mon, 30 Sep 2024 06:15:00 -0700 Subject: [PATCH 3/3] Fixed modulo for negative numbers --- packages/squiggle-lang/__tests__/library/number_test.ts | 4 ++-- packages/squiggle-lang/src/fr/number.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/squiggle-lang/__tests__/library/number_test.ts b/packages/squiggle-lang/__tests__/library/number_test.ts index 59a4389d99..2277d9d947 100644 --- a/packages/squiggle-lang/__tests__/library/number_test.ts +++ b/packages/squiggle-lang/__tests__/library/number_test.ts @@ -39,6 +39,6 @@ describe("Numbers", () => { testEvalToBe("Number.mod(15, 4)", "3"); testEvalToBe("mod(-10, 3)", "2"); testEvalToBe("mod(-5, 3)", "1"); - testEvalToBe("mod(5, -3)", "2"); - testEvalToBe("mod(-5, -3)", "1"); + testEvalToBe("mod(5, -3)", "-1"); + testEvalToBe("mod(-5, -3)", "-2"); }); diff --git a/packages/squiggle-lang/src/fr/number.ts b/packages/squiggle-lang/src/fr/number.ts index 7ec45acb63..29c5840076 100644 --- a/packages/squiggle-lang/src/fr/number.ts +++ b/packages/squiggle-lang/src/fr/number.ts @@ -84,9 +84,9 @@ export const library = [ makeFnExample(`mod(10, -3)`), ], description: - "modulo. Note that there is no '%' operator in Squiggle for this operation..", + "modulo. This is the same as the '%' operator in Python. Note that there is no '%' operator in Squiggle for this operation.", fn: (x, y) => { - return ((x % y) + y) % y; //See: https://stackoverflow.com/questions/4467539/javascript-modulo-gives-a-negative-result-for-negative-numbers + return x - y * Math.floor(x / y); }, }), maker.n2n({