mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-11 15:16:54 +08:00
Use union to swap [skip ci]
This commit is contained in:
@@ -104,13 +104,30 @@ HalfToFloat4(half num)
|
|||||||
/* TODO Improve performance */
|
/* TODO Improve performance */
|
||||||
|
|
||||||
/* Assumes same endianness for floats and integers */
|
/* Assumes same endianness for floats and integers */
|
||||||
/* TODO Use union to swap */
|
union
|
||||||
uint16 bin = *((uint16 *) &num);
|
{
|
||||||
uint32 exponent = (bin & 0x7C00) >> 10;
|
float f;
|
||||||
uint32 mantissa = bin & 0x03FF;
|
uint32 i;
|
||||||
|
} swapfloat;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
half h;
|
||||||
|
uint16 i;
|
||||||
|
} swaphalf;
|
||||||
|
|
||||||
|
uint16 bin;
|
||||||
|
uint32 exponent;
|
||||||
|
uint32 mantissa;
|
||||||
|
uint32 result;
|
||||||
|
|
||||||
|
swaphalf.h = num;
|
||||||
|
bin = swaphalf.i;
|
||||||
|
exponent = (bin & 0x7C00) >> 10;
|
||||||
|
mantissa = bin & 0x03FF;
|
||||||
|
|
||||||
/* Sign */
|
/* Sign */
|
||||||
uint32 result = (bin & 0x8000) << 16;
|
result = (bin & 0x8000) << 16;
|
||||||
|
|
||||||
if (exponent == 31)
|
if (exponent == 31)
|
||||||
{
|
{
|
||||||
@@ -156,8 +173,8 @@ HalfToFloat4(half num)
|
|||||||
result |= mantissa << 13;
|
result |= mantissa << 13;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO Use union to swap */
|
swapfloat.i = result;
|
||||||
return *((float *) &result);
|
return swapfloat.f;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,13 +190,30 @@ Float4ToHalfUnchecked(float num)
|
|||||||
/* TODO Improve performance */
|
/* TODO Improve performance */
|
||||||
|
|
||||||
/* Assumes same endianness for floats and integers */
|
/* Assumes same endianness for floats and integers */
|
||||||
/* TODO Use union to swap */
|
union
|
||||||
uint32 bin = *((uint32 *) &num);
|
{
|
||||||
int exponent = (bin & 0x7F800000) >> 23;
|
float f;
|
||||||
int mantissa = bin & 0x007FFFFF;
|
uint32 i;
|
||||||
|
} swapfloat;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
half h;
|
||||||
|
uint16 i;
|
||||||
|
} swaphalf;
|
||||||
|
|
||||||
|
uint32 bin;
|
||||||
|
int exponent;
|
||||||
|
int mantissa;
|
||||||
|
uint16 result;
|
||||||
|
|
||||||
|
swapfloat.f = num;
|
||||||
|
bin = swapfloat.i;
|
||||||
|
exponent = (bin & 0x7F800000) >> 23;
|
||||||
|
mantissa = bin & 0x007FFFFF;
|
||||||
|
|
||||||
/* Sign */
|
/* Sign */
|
||||||
uint16 result = (bin & 0x80000000) >> 16;
|
result = (bin & 0x80000000) >> 16;
|
||||||
|
|
||||||
if (isinf(num))
|
if (isinf(num))
|
||||||
{
|
{
|
||||||
@@ -238,8 +272,8 @@ Float4ToHalfUnchecked(float num)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO Use union to swap */
|
swaphalf.i = result;
|
||||||
return *((half *) & result);
|
return swaphalf.h;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user