mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-02 02:31:16 +08:00
Fixed overflow with vector_norm
This commit is contained in:
@@ -736,13 +736,13 @@ vector_norm(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Vector *a = PG_GETARG_VECTOR_P(0);
|
||||
float *ax = a->x;
|
||||
float norm = 0.0;
|
||||
double norm = 0.0;
|
||||
|
||||
/* Auto-vectorized */
|
||||
for (int i = 0; i < a->dim; i++)
|
||||
norm += ax[i] * ax[i];
|
||||
norm += (double) ax[i] * (double) ax[i];
|
||||
|
||||
PG_RETURN_FLOAT8(sqrt((double) norm));
|
||||
PG_RETURN_FLOAT8(sqrt(norm));
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -48,6 +48,12 @@ SELECT vector_norm('[0,1]');
|
||||
1
|
||||
(1 row)
|
||||
|
||||
SELECT vector_norm('[3e37,4e37]')::real;
|
||||
vector_norm
|
||||
-------------
|
||||
5e+37
|
||||
(1 row)
|
||||
|
||||
SELECT l2_distance('[0,0]', '[3,4]');
|
||||
l2_distance
|
||||
-------------
|
||||
|
||||
@@ -11,6 +11,7 @@ SELECT vector_dims('[1,2,3]');
|
||||
SELECT round(vector_norm('[1,1]')::numeric, 5);
|
||||
SELECT vector_norm('[3,4]');
|
||||
SELECT vector_norm('[0,1]');
|
||||
SELECT vector_norm('[3e37,4e37]')::real;
|
||||
|
||||
SELECT l2_distance('[0,0]', '[3,4]');
|
||||
SELECT l2_distance('[0,0]', '[0,1]');
|
||||
|
||||
Reference in New Issue
Block a user