Fix nan comparison result of fixed double

This commit is contained in:
hezuojiao
2024-05-16 06:47:53 +00:00
committed by ob-robot
parent 84cdeb1437
commit 238f10498b
6 changed files with 41 additions and 32 deletions

View File

@ -459,13 +459,13 @@ int ObExprUtil::get_mb_str_info(const ObString &str,
double ObExprUtil::round_double(double val, int64_t dec)
{
const double pow_val = std::pow(10, static_cast<double>(std::abs(dec)));
volatile double val_div_tmp = val / pow_val;
volatile double val_mul_tmp = val * pow_val;
volatile double res = 0.0;
const double pow_val = std::pow(10.0, static_cast<double>(std::abs(dec)));
double val_div_tmp = val / pow_val;
double val_mul_tmp = val * pow_val;
double res = 0.0;
if (dec < 0 && std::isinf(pow_val)) {
res = 0.0;
} else if (dec >= 0 && std::isinf(val_mul_tmp)) {
} else if (dec >= 0 && !std::isfinite(val_mul_tmp)) {
res = val;
} else {
res = dec < 0 ? rint(val_div_tmp) * pow_val : rint(val_mul_tmp) / pow_val;
@ -474,23 +474,6 @@ double ObExprUtil::round_double(double val, int64_t dec)
return res;
}
double ObExprUtil::round_double_nearest(double val, int64_t dec)
{
const double pow_val = std::pow(10, static_cast<double>(std::abs(dec)));
volatile double val_div_tmp = val / pow_val;
volatile double val_mul_tmp = val * pow_val;
volatile double res = 0.0;
if (dec < 0 && std::isinf(pow_val)) {
res = 0.0;
} else if (dec >= 0 && std::isinf(val_mul_tmp)) {
res = val;
} else {
res = dec < 0 ? std::round(val_div_tmp) * pow_val : std::round(val_mul_tmp) / pow_val;
}
LOG_DEBUG("round double done", K(val), K(dec), K(res));
return res;
}
uint64_t ObExprUtil::round_uint64(uint64_t val, int64_t dec)
{
uint64_t res = 0;
@ -524,7 +507,7 @@ double ObExprUtil::trunc_double(double val, int64_t dec)
volatile double res = 0.0;
if (dec < 0 && std::isinf(pow_val)) {
res = 0.0;
} else if (dec >= 0 && std::isinf(val_mul_tmp)) {
} else if (dec >= 0 && !std::isfinite(val_mul_tmp)) {
res = val;
} else {
if (val >= 0) {