Add XMVectorRound half away from zero alternative
The current XMVectorRound uses round-to-nearest (even) a.k.a. banker's rounding. This matches the implementation of the _mm_round_ps (SSE4) and vrndnq_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 of XMVectorRound that supports half away-from-zero rounding instead of round-to-nearest (even).
See Wikipedia
This is also called symmetric rounding.
- 0.5 -> 1.0
- -0.5 -> -1.0
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.