mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-13 16:16:56 +08:00
Store very small values as zero for halfvec
This commit is contained in:
@@ -53,19 +53,6 @@ HalfIsInf(half num)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Check if half is zero
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
HalfIsZero(half num)
|
|
||||||
{
|
|
||||||
#ifdef FLT16_SUPPORT
|
|
||||||
return num == 0;
|
|
||||||
#else
|
|
||||||
return (num & 0x7FFF) == 0x0000;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get a half from a message buffer
|
* Get a half from a message buffer
|
||||||
*/
|
*/
|
||||||
@@ -304,8 +291,6 @@ Float4ToHalf(float num)
|
|||||||
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
||||||
errmsg("\"%s\" is out of range for type halfvec", buf)));
|
errmsg("\"%s\" is out of range for type halfvec", buf)));
|
||||||
}
|
}
|
||||||
if (unlikely(HalfIsZero(result)) && num != 0.0)
|
|
||||||
float_underflow_error();
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -401,16 +386,6 @@ halfvec_isspace(char ch)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PG_VERSION_NUM < 120003
|
|
||||||
static pg_noinline void
|
|
||||||
float_underflow_error(void)
|
|
||||||
{
|
|
||||||
ereport(ERROR,
|
|
||||||
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
|
||||||
errmsg("value out of range: underflow")));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert textual representation to internal representation
|
* Convert textual representation to internal representation
|
||||||
*/
|
*/
|
||||||
@@ -470,7 +445,7 @@ halfvec_in(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
x[dim] = Float4ToHalfUnchecked(val);
|
x[dim] = Float4ToHalfUnchecked(val);
|
||||||
|
|
||||||
if ((errno == ERANGE && (isinf(val) || val == 0)) || (HalfIsInf(x[dim]) && !isinf(val)) || (HalfIsZero(x[dim]) && val != 0))
|
if ((errno == ERANGE && isinf(val)) || (HalfIsInf(x[dim]) && !isinf(val)))
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
||||||
errmsg("\"%s\" is out of range for type halfvec", pt)));
|
errmsg("\"%s\" is out of range for type halfvec", pt)));
|
||||||
@@ -792,11 +767,7 @@ vector_to_halfvec(PG_FUNCTION_ARGS)
|
|||||||
result = InitHalfVector(vec->dim);
|
result = InitHalfVector(vec->dim);
|
||||||
|
|
||||||
for (int i = 0; i < vec->dim; i++)
|
for (int i = 0; i < vec->dim; i++)
|
||||||
{
|
result->x[i] = Float4ToHalf(vec->x[i]);
|
||||||
result->x[i] = Float4ToHalfUnchecked(vec->x[i]);
|
|
||||||
/* TODO Better error for overflow */
|
|
||||||
CheckElement(result->x[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
PG_RETURN_POINTER(result);
|
PG_RETURN_POINTER(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ SELECT '[1,2,3]'::vector::halfvec(3);
|
|||||||
SELECT '[1,2,3]'::vector::halfvec(2);
|
SELECT '[1,2,3]'::vector::halfvec(2);
|
||||||
ERROR: expected 2 dimensions, not 3
|
ERROR: expected 2 dimensions, not 3
|
||||||
SELECT '[65520]'::vector::halfvec;
|
SELECT '[65520]'::vector::halfvec;
|
||||||
ERROR: infinite value not allowed in halfvec
|
ERROR: "65520" is out of range for type halfvec
|
||||||
SELECT '[1e-8]'::vector::halfvec;
|
SELECT '[1e-8]'::vector::halfvec;
|
||||||
halfvec
|
halfvec
|
||||||
---------
|
---------
|
||||||
@@ -113,7 +113,11 @@ ERROR: expected 2 dimensions, not 3
|
|||||||
SELECT '{65520,-65520}'::real[]::halfvec;
|
SELECT '{65520,-65520}'::real[]::halfvec;
|
||||||
ERROR: "65520" is out of range for type halfvec
|
ERROR: "65520" is out of range for type halfvec
|
||||||
SELECT '{1e-8,-1e-8}'::real[]::halfvec;
|
SELECT '{1e-8,-1e-8}'::real[]::halfvec;
|
||||||
ERROR: value out of range: underflow
|
halfvec
|
||||||
|
---------
|
||||||
|
[0,-0]
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT '[0,1.5,0,3.5,0]'::vector::sparsevec;
|
SELECT '[0,1.5,0,3.5,0]'::vector::sparsevec;
|
||||||
sparsevec
|
sparsevec
|
||||||
-----------------
|
-----------------
|
||||||
|
|||||||
@@ -55,17 +55,21 @@ ERROR: "65520" is out of range for type halfvec
|
|||||||
LINE 1: SELECT '[65520,-65520]'::halfvec;
|
LINE 1: SELECT '[65520,-65520]'::halfvec;
|
||||||
^
|
^
|
||||||
SELECT '[1e-8,-1e-8]'::halfvec;
|
SELECT '[1e-8,-1e-8]'::halfvec;
|
||||||
ERROR: "1e-8" is out of range for type halfvec
|
halfvec
|
||||||
LINE 1: SELECT '[1e-8,-1e-8]'::halfvec;
|
---------
|
||||||
^
|
[0,-0]
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT '[4e38,1]'::halfvec;
|
SELECT '[4e38,1]'::halfvec;
|
||||||
ERROR: "4e38" is out of range for type halfvec
|
ERROR: "4e38" is out of range for type halfvec
|
||||||
LINE 1: SELECT '[4e38,1]'::halfvec;
|
LINE 1: SELECT '[4e38,1]'::halfvec;
|
||||||
^
|
^
|
||||||
SELECT '[1e-46,1]'::halfvec;
|
SELECT '[1e-46,1]'::halfvec;
|
||||||
ERROR: "1e-46" is out of range for type halfvec
|
halfvec
|
||||||
LINE 1: SELECT '[1e-46,1]'::halfvec;
|
---------
|
||||||
^
|
[0,1]
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT '[1,2,3'::halfvec;
|
SELECT '[1,2,3'::halfvec;
|
||||||
ERROR: malformed halfvec literal: "[1,2,3"
|
ERROR: malformed halfvec literal: "[1,2,3"
|
||||||
LINE 1: SELECT '[1,2,3'::halfvec;
|
LINE 1: SELECT '[1,2,3'::halfvec;
|
||||||
|
|||||||
Reference in New Issue
Block a user