diff options
author | Lucas CHOLLET <lucas.chollet@free.fr> | 2022-01-01 21:49:30 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-01-02 15:42:13 +0100 |
commit | 7532ef78ad9ddc65c93f71813d1574a7d7237b50 (patch) | |
tree | 11ba836ca10bf1fd0fc8433c0c381a2e8308ccfd /Userland/Applications/Calculator/Calculator.h | |
parent | 939bf3e864b4b49debc39678152b99d7fb0b4992 (diff) | |
download | serenity-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.h | 16 |
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 }; |