From fff3c312066af573a24f9a1c2fd2a61de25d44eb Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Fri, 10 Nov 2023 22:24:51 +0800 Subject: [PATCH] fix: float -0.0000 --- src/utils.cpp | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index 536dc1f..bcf923c 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -43,9 +43,11 @@ double Any2Float(const std::any &value) { return res; } else if (auto ptr = std::any_cast(&value)) return (double)(*ptr); - else if (auto ptr = std::any_cast(&value)) - return std::stod(*ptr); - else + else if (auto ptr = std::any_cast(&value)) { + double tmp = std::stod(*ptr); + if (tmp > -1e-8 && tmp < 0) tmp = 0; + return tmp; + } else throw FatalError("Any2Float: unknown type", 30); } @@ -167,9 +169,11 @@ std::any Add(std::any a, std::any b) { return ZYM::int2048(int(*ptr_a_bool) + int(*ptr_b_bool)); else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr)) return (*ptr_a_int2048) + (*ptr_b_int2048); - else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) - return (*ptr_a_float) + (*ptr_b_float); - else if ((ptr_a_string != nullptr) || (ptr_b_string != nullptr)) + else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) { + double tmp = (*ptr_a_float) + (*ptr_b_float); + if (tmp > -1e-8 && tmp < 0) tmp = 0; + return tmp; + } else if ((ptr_a_string != nullptr) || (ptr_b_string != nullptr)) return Any2String(a) + Any2String(b); else throw FatalError("Add: Type Error", 38); @@ -190,9 +194,11 @@ std::any Sub(std::any a, std::any b) { return ZYM::int2048(int(*ptr_a_bool) - int(*ptr_b_bool)); else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr)) return (*ptr_a_int2048) - (*ptr_b_int2048); - else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) - return (*ptr_a_float) - (*ptr_b_float); - else + else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) { + double tmp = (*ptr_a_float) - (*ptr_b_float); + if (tmp > -1e-8 && tmp < 0) tmp = 0; + return tmp; + } else throw FatalError("Sub: Type Error", 39); return a; } @@ -258,9 +264,11 @@ std::any Mul(std::any a, std::any b) { return ZYM::int2048(int(*ptr_a_bool) * int(*ptr_b_bool)); else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr)) return (*ptr_a_int2048) * (*ptr_b_int2048); - else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) - return (*ptr_a_float) * (*ptr_b_float); - else + else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) { + double tmp = (*ptr_a_float) * (*ptr_b_float); + if (tmp > -1e-8 && tmp < 0) tmp = 0; + return tmp; + } else throw FatalError("Mul: Type Error", 42); } std::any Div(std::any a, std::any b) { @@ -301,8 +309,10 @@ std::any Divv(std::any a, std::any b) { double *ptr_b_float = std::any_cast(&b); if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) { // if ((*ptr_b_float) == 0) - // throw InterpretException("Divv: divided by zero", 45); - return ZYM::int2048(std::floor((*ptr_a_float) / (*ptr_b_float))); + // throw InterpretException("Divv: divided by zero", 45); + double tmp = std::floor((*ptr_a_float) / (*ptr_b_float)); + if (tmp > -1e-8 && tmp < 0) tmp = 0; + return tmp; } else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr)) { if ((*ptr_b_int2048) == 0) // throw InterpretException("Divv: divided by zero", 46); @@ -328,8 +338,10 @@ std::any Mod(std::any a, std::any b) { if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) { // if ((*ptr_b_float) == 0) // throw InterpretException("Mod: divided by zero", 49); - return (*ptr_a_float) - - (*ptr_b_float) * std::floor((*ptr_a_float) / (*ptr_b_float)); + double tmp = (*ptr_a_float) - + (*ptr_b_float) * std::floor((*ptr_a_float) / (*ptr_b_float)); + if (tmp > -1e-8 && tmp < 0) tmp = 0; + return tmp; } else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr)) { // if ((*ptr_b_int2048) == 0) // throw InterpretException("Mod: divided by zero", 50);