Open walbourn opened 7 years ago
This is also called symmetric rounding.
Should be implementable using the existing floor and ceil implementations with some extra selection.
float roundf(float x) { return signbit(x) ? ceil(x - 0.5) : floor(x + 0.5); }
For ARMv8 / ARM64, vrndaq_f32
should do the equivalent of roundf
.
The current
XMVectorRound
uses round-to-nearest (even) a.k.a. banker's rounding. This matches the implementation of the_mm_round_ps
(SSE4) andvrndnq_f32
(ARMv8 NEON) intrinsics rounding behavior, so it can be implemented in a single instruction.Many users, however, expect it to match
roundf
which C99 defines as handling half-way values by rounding away from zero a.k.a. commercial rounding. It might therefore be useful to provide an alternative version ofXMVectorRound
that supports half away-from-zero rounding instead of round-to-nearest (even).See Wikipedia