Added NzMultiplyAdd
Use hardware FMA (or at least faster FMA) when possible Former-commit-id: fd5134d2aebe924fb8c9148224101dd7d340bb5f
This commit is contained in:
parent
23da4ce420
commit
b05f813e70
|
|
@ -24,6 +24,7 @@ template<typename T> T NzApproach(T value, T objective, T increment);
|
|||
template<typename T> T NzClamp(T value, T min, T max);
|
||||
template<typename T> T NzDegrees(T degrees);
|
||||
template<typename T> T NzDegreeToRadian(T degrees);
|
||||
template<typename T> T NzMultiplyAdd(T x, T y, T z);
|
||||
unsigned int NzIntegralPow(unsigned int base, unsigned int exponent);
|
||||
unsigned int NzGetNearestPowerOfTwo(unsigned int number);
|
||||
unsigned int NzGetNumberLength(signed char number);
|
||||
|
|
|
|||
|
|
@ -50,6 +50,36 @@ T NzDegreeToRadian(T degrees)
|
|||
return degrees * F(M_PI/180.0);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T NzMultiplyAdd(T x, T y, T z)
|
||||
{
|
||||
return x*y + z;
|
||||
}
|
||||
|
||||
#ifdef FP_FAST_FMAF
|
||||
template<>
|
||||
inline float NzMultiplyAdd(float x, float y, float z)
|
||||
{
|
||||
return std::fmaf(x, y, z);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef FP_FAST_FMA
|
||||
template<>
|
||||
inline double NzMultiplyAdd(double x, double y, double z)
|
||||
{
|
||||
return std::fma(x, y, z);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef FP_FAST_FMAL
|
||||
template<>
|
||||
inline long double NzMultiplyAdd(long double x, long double y, long double z)
|
||||
{
|
||||
return std::fmal(x, y, z);
|
||||
}
|
||||
#endif
|
||||
|
||||
inline unsigned int NzIntegralPow(unsigned int base, unsigned int exponent)
|
||||
{
|
||||
unsigned int r = 1;
|
||||
|
|
|
|||
Loading…
Reference in New Issue