fix: float -0.0000
This commit is contained in:
@ -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);
|
||||||
|
Reference in New Issue
Block a user