From 5aae8a731c5e77667532c06e48f6e9796d0fd825 Mon Sep 17 00:00:00 2001 From: KaiGai Kohei Date: Wed, 6 Mar 2024 22:09:51 +0900 Subject: [PATCH] bugfix: float comparison functions (like float8gt) needs special handling at NaN issue was reported by Sakai-san --- src/xpu_basetype.cu | 63 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/src/xpu_basetype.cu b/src/xpu_basetype.cu index 80921871d..a5731a2fa 100644 --- a/src/xpu_basetype.cu +++ b/src/xpu_basetype.cu @@ -462,15 +462,60 @@ PG_SIMPLE_COMPARE_TEMPLATE(int82, int8, int2, (int64_t)) PG_SIMPLE_COMPARE_TEMPLATE(int84, int8, int4, (int64_t)) PG_SIMPLE_COMPARE_TEMPLATE(int8, int8, int8, ) -PG_SIMPLE_COMPARE_TEMPLATE(float2, float2, float2, ) -PG_SIMPLE_COMPARE_TEMPLATE(float24, float2, float4, (float4_t)) -PG_SIMPLE_COMPARE_TEMPLATE(float28, float2, float8, (float8_t)) -PG_SIMPLE_COMPARE_TEMPLATE(float42, float4, float2, (float4_t)) -PG_SIMPLE_COMPARE_TEMPLATE(float4, float4, float4, ) -PG_SIMPLE_COMPARE_TEMPLATE(float48, float4, float8, (float8_t)) -PG_SIMPLE_COMPARE_TEMPLATE(float82, float8, float2, (float8_t)) -PG_SIMPLE_COMPARE_TEMPLATE(float84, float8, float4, (float8_t)) -PG_SIMPLE_COMPARE_TEMPLATE(float8, float8, float8, ) +#define __float_comp_eq(x,y,CAST) \ + (isnan(x) ? isnan(y) : !isnan(y) && (CAST (x) == CAST (y))) +#define __float_comp_ne(x,y,CAST) \ + (isnan(x) ? !isnan(y) : isnan(y) || (CAST (x) != CAST (y))) +#define __float_comp_lt(x,y,CAST) \ + (!isnan(x) && (isnan(y) || (CAST (x) < CAST (y)))) +#define __float_comp_le(x,y,CAST) \ + (isnan(y) || (!isnan(x) && (CAST (x) <= CAST (y)))) +#define __float_comp_gt(x,y,CAST) \ + (!isnan(y) && (isnan(x) || (CAST (x) > CAST (y)))) +#define __float_comp_ge(x,y,CAST) \ + (isnan(x) || (!isnan(y) && (CAST (x) >= CAST (y)))) + +#define __PG_FLOAT_COMPARE_TEMPLATE(FNAME,LNAME,RNAME,CAST,EXTRA) \ + PUBLIC_FUNCTION(bool) \ + pgfn_##FNAME##EXTRA(XPU_PGFUNCTION_ARGS) \ + { \ + KEXP_PROCESS_ARGS2(bool,LNAME,lval,RNAME,rval); \ + if (XPU_DATUM_ISNULL(&lval) || XPU_DATUM_ISNULL(&rval)) \ + { \ + __pg_simple_nullcomp_eq(&lval, &rval); \ + } \ + else \ + { \ + result->expr_ops = kexp->expr_ops; \ + result->value = __float_comp_##EXTRA(lval.value, \ + rval.value, CAST); \ + } \ + return true; \ + } +#define PG_FLOAT_COMPARE_TEMPLATE(FNAME,LNAME,RNAME,CAST) \ + __PG_FLOAT_COMPARE_TEMPLATE(FNAME,LNAME,RNAME,CAST,eq) \ + __PG_FLOAT_COMPARE_TEMPLATE(FNAME,LNAME,RNAME,CAST,ne) \ + __PG_FLOAT_COMPARE_TEMPLATE(FNAME,LNAME,RNAME,CAST,lt) \ + __PG_FLOAT_COMPARE_TEMPLATE(FNAME,LNAME,RNAME,CAST,le) \ + __PG_FLOAT_COMPARE_TEMPLATE(FNAME,LNAME,RNAME,CAST,gt) \ + __PG_FLOAT_COMPARE_TEMPLATE(FNAME,LNAME,RNAME,CAST,ge) \ + +PG_FLOAT_COMPARE_TEMPLATE(float2, float2, float2, ) +PG_FLOAT_COMPARE_TEMPLATE(float24, float2, float4, (float4_t)) +PG_FLOAT_COMPARE_TEMPLATE(float28, float2, float8, (float8_t)) +PG_FLOAT_COMPARE_TEMPLATE(float42, float4, float2, (float4_t)) +PG_FLOAT_COMPARE_TEMPLATE(float4, float4, float4, ) +PG_FLOAT_COMPARE_TEMPLATE(float48, float4, float8, (float8_t)) +PG_FLOAT_COMPARE_TEMPLATE(float82, float8, float2, (float8_t)) +PG_FLOAT_COMPARE_TEMPLATE(float84, float8, float4, (float8_t)) +PG_FLOAT_COMPARE_TEMPLATE(float8, float8, float8, ) + +#undef __float_comp_eq +#undef __float_comp_ne +#undef __float_comp_lt +#undef __float_comp_le +#undef __float_comp_gt +#undef __float_comp_ge /* * Binary operator template