From b1bbccf04d6b350fd5019f9e23ad9c8ae82c9b03 Mon Sep 17 00:00:00 2001 From: Nicolas Brunie Date: Fri, 22 Sep 2023 18:30:13 -0700 Subject: fixing bf16_to_f32 for subnormal numbers --- source/bf16_to_f32.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/source/bf16_to_f32.c b/source/bf16_to_f32.c index a76632e..b86482c 100644 --- a/source/bf16_to_f32.c +++ b/source/bf16_to_f32.c @@ -74,17 +74,11 @@ float32_t bf16_to_f32( bfloat16_t a ) } /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ - if ( ! exp ) { - if ( ! frac ) { - uiZ = packToF32UI( sign, 0, 0 ); - goto uiZ; - } - normExpSig = softfloat_normSubnormalBF16Sig( frac ); - exp = normExpSig.exp - 1; - frac = normExpSig.sig; - } - /*------------------------------------------------------------------------ - *------------------------------------------------------------------------*/ + // packToF32UI simply packs bitfields without any numerical change + // which means it can be used directly for any BF16 to f32 conversions which + // does not require bits manipulation + // (that is everything where the 16-bit are just padded right with 16 zeros, including + // subnormal numbers) uiZ = packToF32UI( sign, exp, ((uint_fast32_t) frac) <<16 ); uiZ: uZ.ui = uiZ; -- cgit v1.1