fix: float -0.0000

This commit is contained in:
2023-11-10 22:24:51 +08:00
parent 6355aef081
commit fff3c31206

View File

@ -43,9 +43,11 @@ double Any2Float(const std::any &value) {
return res; return res;
} else if (auto ptr = std::any_cast<bool>(&value)) } else if (auto ptr = std::any_cast<bool>(&value))
return (double)(*ptr); return (double)(*ptr);
else if (auto ptr = std::any_cast<std::string>(&value)) else if (auto ptr = std::any_cast<std::string>(&value)) {
return std::stod(*ptr); double tmp = std::stod(*ptr);
else if (tmp > -1e-8 && tmp < 0) tmp = 0;
return tmp;
} else
throw FatalError("Any2Float: unknown type", 30); 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)); return ZYM::int2048(int(*ptr_a_bool) + int(*ptr_b_bool));
else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr)) else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr))
return (*ptr_a_int2048) + (*ptr_b_int2048); return (*ptr_a_int2048) + (*ptr_b_int2048);
else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) {
return (*ptr_a_float) + (*ptr_b_float); double tmp = (*ptr_a_float) + (*ptr_b_float);
else if ((ptr_a_string != nullptr) || (ptr_b_string != nullptr)) 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); return Any2String(a) + Any2String(b);
else else
throw FatalError("Add: Type Error", 38); 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)); return ZYM::int2048(int(*ptr_a_bool) - int(*ptr_b_bool));
else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr)) else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr))
return (*ptr_a_int2048) - (*ptr_b_int2048); return (*ptr_a_int2048) - (*ptr_b_int2048);
else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) {
return (*ptr_a_float) - (*ptr_b_float); double tmp = (*ptr_a_float) - (*ptr_b_float);
else if (tmp > -1e-8 && tmp < 0) tmp = 0;
return tmp;
} else
throw FatalError("Sub: Type Error", 39); throw FatalError("Sub: Type Error", 39);
return a; 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)); return ZYM::int2048(int(*ptr_a_bool) * int(*ptr_b_bool));
else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr)) else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr))
return (*ptr_a_int2048) * (*ptr_b_int2048); return (*ptr_a_int2048) * (*ptr_b_int2048);
else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) else if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) {
return (*ptr_a_float) * (*ptr_b_float); double tmp = (*ptr_a_float) * (*ptr_b_float);
else if (tmp > -1e-8 && tmp < 0) tmp = 0;
return tmp;
} else
throw FatalError("Mul: Type Error", 42); throw FatalError("Mul: Type Error", 42);
} }
std::any Div(std::any a, std::any b) { 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<double>(&b); double *ptr_b_float = std::any_cast<double>(&b);
if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) { if ((ptr_a_float != nullptr) && (ptr_b_float != nullptr)) {
// if ((*ptr_b_float) == 0) // if ((*ptr_b_float) == 0)
// throw InterpretException("Divv: divided by zero", 45); // throw InterpretException("Divv: divided by zero", 45);
return ZYM::int2048(std::floor((*ptr_a_float) / (*ptr_b_float))); 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)) { } else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr)) {
if ((*ptr_b_int2048) == 0) if ((*ptr_b_int2048) == 0)
// throw InterpretException("Divv: divided by zero", 46); // 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_a_float != nullptr) && (ptr_b_float != nullptr)) {
// if ((*ptr_b_float) == 0) // if ((*ptr_b_float) == 0)
// throw InterpretException("Mod: divided by zero", 49); // throw InterpretException("Mod: divided by zero", 49);
return (*ptr_a_float) - double tmp = (*ptr_a_float) -
(*ptr_b_float) * std::floor((*ptr_a_float) / (*ptr_b_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)) { } else if ((ptr_a_int2048 != nullptr) && (ptr_b_int2048 != nullptr)) {
// if ((*ptr_b_int2048) == 0) // if ((*ptr_b_int2048) == 0)
// throw InterpretException("Mod: divided by zero", 50); // throw InterpretException("Mod: divided by zero", 50);