fp16/bf16: fix NumTraits<half>::epsilon, half GPU raw-bit interop, RVV10 bf16 masks, and 16-bit normal RNG

libeigen/eigen!2704

Co-authored-by: Rasmus Munk Larsen <rmlarsen@gmail.com>
This commit is contained in:
Rasmus Munk Larsen
2026-07-10 14:55:30 -07:00
co-authored by Rasmus Munk Larsen
parent c453a87216
commit 40e7e38646
12 changed files with 311 additions and 22 deletions
+8
View File
@@ -127,6 +127,14 @@ void test_numtraits() {
VERIFY(NumTraits<half>::IsSigned);
// The fp16 machine epsilon is 2^-10 = 0x1400, and NumTraits must agree with
// std::numeric_limits (NumTraits used to return 2^-13, making every
// epsilon-based threshold 8x too tight).
VERIFY_HALF_BITS_EQUAL(NumTraits<half>::epsilon(), 0x1400);
VERIFY_HALF_BITS_EQUAL(std::numeric_limits<half>::epsilon(), 0x1400);
VERIFY_IS_EQUAL(numext::bit_cast<numext::uint16_t>(NumTraits<half>::epsilon()),
numext::bit_cast<numext::uint16_t>(std::numeric_limits<half>::epsilon()));
VERIFY_IS_EQUAL(numext::bit_cast<numext::uint16_t>(std::numeric_limits<half>::infinity()),
numext::bit_cast<numext::uint16_t>(half(std::numeric_limits<float>::infinity())));
// There is no guarantee that casting a 32-bit NaN to 16-bit has a precise