https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116319
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- The answer here is correct due to the way arithmetic is done for bfloat16_t. It is just a storage unit. All math is done in 32bit float. const float bb = b; const float cc = c; const float dd = fma(bb, bb, cc); cout << static_cast<double>(dd) << "\n"; So the rounding (5.64062) back to bfloat16_t gives 5.625. That is there is a double rounding going on.