Вы можете сделать:
if (numeric_limits<float>::max() - val < m_speed)
{
m_speed = 0;
}
else
{
m_speed += val;
}
Другим методом может быть:
m_speed += val;
if (m_speed == numeric_limits<float>::infinity())
m_speed = 0;
Но имейте в виду, когда переполнение действительно происходит, результатом является неопределенное поведение.Таким образом, хотя это, вероятно, работает на большинстве машин, это не гарантируется.Лучше поймать его до того, как это произойдет.
Так как поначалу читать это не просто, я бы обернул его в функцию:
template <typename T>
bool will_overflow(const T& pX, const T& pValue,
const T& pMax = std::numeric_limits<T>::max())
{
return pMax - pValue < pX;
}
template <typename T>
bool will_underflow(const T& pX, const T& pValue,
const T& pMin = std::numeric_limits<T>::min())
{
return pMin + pValue > pX;
}
m_speed = will_overflow(m_speed, val) ? 0 : m_speed + val;