From ea67090451b9e6e146ccc58440844d872559ac86 Mon Sep 17 00:00:00 2001 From: nezznee Date: Sun, 17 May 2026 01:26:45 +0200 Subject: [PATCH 1/3] Fix https://github.com/clementwzk/OpenCalc/issues/600 --- .../com/darkempire78/opencalculator/calculator/Calculator.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt b/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt index 610036f2a..915271292 100644 --- a/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt +++ b/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt @@ -76,6 +76,10 @@ class Calculator( val firstPart = sqrtTwoPi * t.pow(z + 0.5) * exp(-t) val result = firstPart * a + if (!result.isFinite()) { + is_infinity = true + return BigDecimal.ZERO + } return BigDecimal(result, MathContext.DECIMAL64) } From 0e6da62c5fa2fda24548d7990e0cf3ef457628d2 Mon Sep 17 00:00:00 2001 From: nezznee Date: Mon, 18 May 2026 21:32:42 +0200 Subject: [PATCH 2/3] Use Double#isInfinite instead of !Double#isFinite as isFinite also checks for NaN which is handled upstream. --- .../com/darkempire78/opencalculator/calculator/Calculator.kt | 2 +- .../com/darkempire78/opencalculator/ExpressionUnitTest.kt | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt b/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt index 915271292..3a7dbe84a 100644 --- a/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt +++ b/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt @@ -76,7 +76,7 @@ class Calculator( val firstPart = sqrtTwoPi * t.pow(z + 0.5) * exp(-t) val result = firstPart * a - if (!result.isFinite()) { + if (result.isInfinite()) { is_infinity = true return BigDecimal.ZERO } diff --git a/app/src/test/java/com/darkempire78/opencalculator/ExpressionUnitTest.kt b/app/src/test/java/com/darkempire78/opencalculator/ExpressionUnitTest.kt index 94ee855dd..5bdca09d4 100644 --- a/app/src/test/java/com/darkempire78/opencalculator/ExpressionUnitTest.kt +++ b/app/src/test/java/com/darkempire78/opencalculator/ExpressionUnitTest.kt @@ -73,7 +73,7 @@ class ExpressionUnitTest { Samsung Calculator has a result of 22.76976 here and Google Calculator yields 16.732. OpenCalc yields 18.75176. 4Investigating the correct answer. We typically would not do something so ambiguous. Are we adding percentages or adding a - a percentage of the previous number? An answer of 7.21 is also possible. How far down + percentage of the previous number? An answer of 7.21 is also possible. How far down this rabbit hole do we want to go? Everyday calculations should be correct now. */ result = calculate("164%+(265-20%)%+345%", isDegreeModeActivated = false).toDouble() @@ -190,6 +190,9 @@ class ExpressionUnitTest { result = calculate("(3!)!/(3!)!", false).toDouble() assertEquals(1.0, result, 0.0) + + result = calculate("(21.3*12.5)!",false).toDouble() + assertEquals(0.0, result, 0.0) } @Test From 33943034f506b77b5ff2653bedda0240b13e2ca8 Mon Sep 17 00:00:00 2001 From: nezznee Date: Mon, 18 May 2026 21:59:40 +0200 Subject: [PATCH 3/3] Nevermind it can be NaN so !isFinite is needed..: 1000.02! -> 1. 1007.52.pow(1000.52) overflows to Infinity. 2. exp(-1007.52) underflows to 0.0. 3. Infinity * 0.0 results in NaN. --- .../com/darkempire78/opencalculator/calculator/Calculator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt b/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt index 3a7dbe84a..915271292 100644 --- a/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt +++ b/app/src/main/java/com/darkempire78/opencalculator/calculator/Calculator.kt @@ -76,7 +76,7 @@ class Calculator( val firstPart = sqrtTwoPi * t.pow(z + 0.5) * exp(-t) val result = firstPart * a - if (result.isInfinite()) { + if (!result.isFinite()) { is_infinity = true return BigDecimal.ZERO }