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;
} else if (auto ptr = std::any_cast<bool>(&value))
return (double)(*ptr);
else if (auto ptr = std::any_cast<std::string>(&value))
return std::stod(*ptr);
else
else if (auto ptr = std::any_cast<std::string>(&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<double>(&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);