From 88d0774d30f7feff986c1baf19a92e8d1eef4fa5 Mon Sep 17 00:00:00 2001 From: Username404 Date: Tue, 22 Mar 2022 18:17:36 +0100 Subject: [PATCH] Fix the precision of StandardComponents::types::Integer Signed-off-by: Username404 --- src/headers/parsing/ParseComponents.hpp | 6 ++++-- src/headers/parsing/Parser.hpp | 9 ++++++--- src/headers/transpiler/Target.hpp | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/headers/parsing/ParseComponents.hpp b/src/headers/parsing/ParseComponents.hpp index ce5ef71..e7b7b04 100644 --- a/src/headers/parsing/ParseComponents.hpp +++ b/src/headers/parsing/ParseComponents.hpp @@ -106,8 +106,10 @@ namespace StandardComponents { }; namespace types { struct Integer: ParseComponent { - long double value; - Integer(const string& value): value(stold(value)) {} + typedef uint_fast8_t precision_type; + const long double value; + const precision_type precision; + Integer(const long double& value, const precision_type& precision): value(value), precision(precision) {} }; struct String: ParseComponent { const string content; diff --git a/src/headers/parsing/Parser.hpp b/src/headers/parsing/Parser.hpp index 2516884..02d5062 100644 --- a/src/headers/parsing/Parser.hpp +++ b/src/headers/parsing/Parser.hpp @@ -44,13 +44,16 @@ namespace Parser { switch (current.toktype) { case NUMBER: { - types::Integer Int = current.toktext; + long double v = stoul(current.toktext); + if (i > 0 && lexed[i - 1].toktype == HYPHEN) v = -v; + types::Integer::precision_type p = 0; if (nextAre({DOT, NUMBER})) { i += 2; const string& right = lexed[i].toktext; - Int.value += stold(right) / powl(10, right.size()); + p = min(static_cast(right.size()), numeric_limits::digits10); + v += copysign(stold(right.substr(0, p)) / powl(10, p), v); } - parseTree << Int; + parseTree << types::Integer(v, p); break; } case STRING: parseTree << types::String(current.toktext.data()); break; diff --git a/src/headers/transpiler/Target.hpp b/src/headers/transpiler/Target.hpp index 795aac7..c649356 100644 --- a/src/headers/transpiler/Target.hpp +++ b/src/headers/transpiler/Target.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #ifdef __GNUC__ #include #endif @@ -133,7 +134,7 @@ public: separate_transpileTree(parseComponent, ", "); output << ')'; ), - make_task(StandardComponents::types::Integer, output << parseComponent.value;) + make_task(StandardComponents::types::Integer, output << setprecision(parseComponent.precision) << fixed << parseComponent.value;) })); return staticMap; };