DirectXMath icon indicating copy to clipboard operation
DirectXMath copied to clipboard

Add XMVectorRound half away from zero alternative

Open walbourn opened this issue 9 years ago • 2 comments

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

walbourn avatar Oct 25 '16 23:10 walbourn

This is also called symmetric rounding.

  • 0.5 -> 1.0
  • -0.5 -> -1.0

nfrechette avatar Apr 21 '17 22:04 nfrechette

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.

walbourn avatar Oct 29 '21 04:10 walbourn