당신이 할 수있는 :.?
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;
을하지만 오버 플로우가 실제로 발생했을 때 염두에 두어야 할, 결과는 정의되지 않은 동작입니다. 따라서 대부분의 시스템에서 작동하지만 보장 할 수는 없습니다. 당신은 그것이 일어나기 전에 그것을 잡는 것이 낫습니다.
이 처음 읽는 사소한 아니기 때문에, 나는 함수로 묶지 것 : 당신이 FLT_MAX
을 초과하는 경우
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;
는 +/- Inf를가 NaN의 –
@Axel과 동일하지 않습니다 : 좋은 지적 - 난으로 융합하지 말았어야 두 - I가 NaN하지만, IEEE-754로 처리 한 종류로 INF 생각하는 경향이 다른 엔티티. –