summaryrefslogtreecommitdiff
path: root/Userland/Applications/Calculator/Calculator.h
diff options
context:
space:
mode:
authorLucas CHOLLET <lucas.chollet@free.fr>2022-01-01 21:49:30 +0100
committerAndreas Kling <kling@serenityos.org>2022-01-02 15:42:13 +0100
commit7532ef78ad9ddc65c93f71813d1574a7d7237b50 (patch)
tree11ba836ca10bf1fd0fc8433c0c381a2e8308ccfd /Userland/Applications/Calculator/Calculator.h
parent939bf3e864b4b49debc39678152b99d7fb0b4992 (diff)
downloadserenity-7532ef78ad9ddc65c93f71813d1574a7d7237b50.zip
Calculator: Round small number to prevent crash
Small numbers (smaller than 1e-19) can't be displayed in the calculator. They provoke a division by zero in Keypad::set_value(), as 10^20 overflows.
Diffstat (limited to 'Userland/Applications/Calculator/Calculator.h')
-rw-r--r--Userland/Applications/Calculator/Calculator.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/Userland/Applications/Calculator/Calculator.h b/Userland/Applications/Calculator/Calculator.h
index 1ca9fca5c0..91f6c21eff 100644
--- a/Userland/Applications/Calculator/Calculator.h
+++ b/Userland/Applications/Calculator/Calculator.h
@@ -47,6 +47,22 @@ public:
void clear_error() { m_has_error = false; }
private:
+ static bool should_be_rounded(KeypadValue);
+ static void round(KeypadValue&);
+
+ static constexpr auto rounding_threshold = []() consteval
+ {
+ using used_type = u64;
+
+ auto count = 1;
+ used_type res = 10;
+ while (!__builtin_mul_overflow(res, (used_type)10, &res)) {
+ count++;
+ }
+ return count;
+ }
+ ();
+
Operation m_operation_in_progress { Operation::None };
KeypadValue m_saved_argument { (i64)0 };
KeypadValue m_mem { (i64)0 };