Merge pull request #2944 from huwpascoe/perf-3

Optimized Float<M,E> multiplication
This commit is contained in:
Weiyi Wang 2017-09-25 03:37:14 +03:00 committed by GitHub
commit a81536f53f

View File

@ -58,11 +58,12 @@ public:
} }
Float<M, E> operator*(const Float<M, E>& flt) const { Float<M, E> operator*(const Float<M, E>& flt) const {
if ((this->value == 0.f && !std::isnan(flt.value)) || float result = value * flt.ToFloat32();
(flt.value == 0.f && !std::isnan(this->value))) // PICA gives 0 instead of NaN when multiplying by inf
// PICA gives 0 instead of NaN when multiplying by inf if (!std::isnan(value) && !std::isnan(flt.ToFloat32()))
return Zero(); if (std::isnan(result))
return Float<M, E>::FromFloat32(ToFloat32() * flt.ToFloat32()); result = 0.f;
return Float<M, E>::FromFloat32(result);
} }
Float<M, E> operator/(const Float<M, E>& flt) const { Float<M, E> operator/(const Float<M, E>& flt) const {
@ -78,12 +79,7 @@ public:
} }
Float<M, E>& operator*=(const Float<M, E>& flt) { Float<M, E>& operator*=(const Float<M, E>& flt) {
if ((this->value == 0.f && !std::isnan(flt.value)) || value = operator*(flt).value;
(flt.value == 0.f && !std::isnan(this->value)))
// PICA gives 0 instead of NaN when multiplying by inf
*this = Zero();
else
value *= flt.ToFloat32();
return *this; return *this;
} }