microsoft / DirectXMath

DirectXMath is an all inline SIMD C++ linear algebra library for use in games and graphics apps
https://walbourn.github.io/introducing-directxmath/
MIT License
1.54k stars 236 forks source link

Add XMVectorRound half away from zero alternative #39

Open walbourn opened 7 years ago

walbourn commented 7 years ago

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

nfrechette commented 7 years ago

This is also called symmetric rounding.

walbourn commented 2 years ago

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.