From fd8c5446bbd692ff0aba92ae097d6190ba4cf46f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 5 Nov 2025 22:20:30 +0000 Subject: [PATCH 1/3] Initial plan From ae3417908ed98ef4e98b3fbd482372ec5917601b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 5 Nov 2025 22:37:49 +0000 Subject: [PATCH 2/3] Add ln (natural log) button and server/client support Co-authored-by: sdley <102539941+sdley@users.noreply.github.com> --- api/controller.js | 19 +++++++++++++------ public/client.js | 12 ++++++++++++ public/index.html | 4 ++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/api/controller.js b/api/controller.js index 3e03a4b..849c0c2 100644 --- a/api/controller.js +++ b/api/controller.js @@ -26,6 +26,10 @@ exports.calculate = function (req, res) { power: function (a, b) { return Math.pow(a, b); }, + // natural logarithm (ln) - uses only operand1 + ln: function (a, b) { + return Math.log(Number(a)); + }, }; if (!req.query.operation) { @@ -46,12 +50,15 @@ exports.calculate = function (req, res) { throw new Error("Invalid operand1: " + req.query.operand1); } - if ( - !req.query.operand2 || - !req.query.operand2.match(/^(-)?[0-9\.]+(e(-)?[0-9]+)?$/) || - req.query.operand2.replace(/[-0-9e]/g, "").length > 1 - ) { - throw new Error("Invalid operand2: " + req.query.operand2); + // For unary ops like ln we don't require operand2; for others we do + if (req.query.operation !== "ln") { + if ( + !req.query.operand2 || + !req.query.operand2.match(/^(-)?[0-9\.]+(e(-)?[0-9]+)?$/) || + req.query.operand2.replace(/[-0-9e]/g, "").length > 1 + ) { + throw new Error("Invalid operand2: " + req.query.operand2); + } } res.json({ result: operation(req.query.operand1, req.query.operand2) }); diff --git a/public/client.js b/public/client.js index 9df4075..fc4db6a 100644 --- a/public/client.js +++ b/public/client.js @@ -35,6 +35,9 @@ function calculate(operand1, operand2, operation) { case "^": uri += "?operation=power"; break; + case "ln": + uri += "?operation=ln"; + break; default: setError(); return; @@ -113,8 +116,17 @@ function signPressed() { } function operationPressed(op) { + // store operand1 operand1 = getValue(); operation = op; + + // ln is a unary operator (natural log) — compute immediately using operand1 + if (op === "ln") { + state = states.complete; + calculate(operand1, 0, operation); + return; + } + state = states.operator; } diff --git a/public/index.html b/public/index.html index 8fcfca5..5725dbb 100644 --- a/public/index.html +++ b/public/index.html @@ -43,6 +43,10 @@ + + + + From b83f3a68a07941b82ad0f037e33ad7168dd7669a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 5 Nov 2025 22:40:21 +0000 Subject: [PATCH 3/3] Improve ln function signature to only accept one parameter Co-authored-by: sdley <102539941+sdley@users.noreply.github.com> --- api/controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/controller.js b/api/controller.js index 849c0c2..31bf8b8 100644 --- a/api/controller.js +++ b/api/controller.js @@ -27,7 +27,7 @@ exports.calculate = function (req, res) { return Math.pow(a, b); }, // natural logarithm (ln) - uses only operand1 - ln: function (a, b) { + ln: function (a) { return Math.log(Number(a)); }, };