如果某个值发生浮点溢出,我想将其设置为零,就像这样......
m_speed += val;
if ( m_speed > numeric_limits<float>::max()) { // This might not even work, since some impls will wraparound after previous line
m_speed = 0.f
}
但有一次val
已添加到m_speed
,溢出已经发生(并且我假设如果我这样做也会发生同样的问题if (( m_speed + val ) > ..)
.
如何检查以确保发生溢出而不导致溢出?
你可以这样做:
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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)