Improved check [skip ci]

This commit is contained in:
Andrew Kane
2023-12-04 13:59:48 -08:00
parent 006e5c7aca
commit a679b584e9
3 changed files with 18 additions and 4 deletions

View File

@@ -294,6 +294,19 @@ HalfIsInf(half num)
#endif
}
/*
* Check if half is zero
*/
static inline bool
HalfIsZero(half num)
{
#ifdef FLT16_SUPPORT
return num == 0;
#else
return (num << 1) == 0x0000;
#endif
}
/*
* Convert a float4 to a half
*/
@@ -304,8 +317,7 @@ Float4ToHalf(float num)
if (unlikely(HalfIsInf(result)) && !isinf(num))
float_overflow_error();
/* TODO Perform check without HalfToFloat4 */
if (unlikely(HalfToFloat4(result) == 0.0f) && num != 0.0)
if (unlikely(HalfIsZero(result)) && num != 0.0)
float_underflow_error();
return result;
@@ -322,8 +334,7 @@ Float8ToHalf(double num)
if (unlikely(HalfIsInf(result)) && !isinf(num))
float_overflow_error();
/* TODO Perform check without HalfToFloat4 */
if (unlikely(HalfToFloat4(result) == 0.0f) && num != 0.0)
if (unlikely(HalfIsZero(result)) && num != 0.0)
float_underflow_error();
return result;

View File

@@ -82,6 +82,8 @@ SELECT 'Infinity'::real::half;
Infinity
(1 row)
SELECT '1e-38'::real::half;
ERROR: value out of range: underflow
SELECT '1.5'::half::real;
float4
--------

View File

@@ -17,6 +17,7 @@ SELECT '{1,2,3}'::half[]::real[];
SELECT '65505'::integer::half;
SELECT 'NaN'::real::half;
SELECT 'Infinity'::real::half;
SELECT '1e-38'::real::half;
SELECT '1.5'::half::real;
SELECT '1.5'::real::half;