Может ли кто-нибудь объяснить, почему этот фрагмент не создает исключение underflow (на MSVC 2013 и gcc @ coliru)? Значение, возвращаемое из средней функции, меньше DBL_MIN
.Почему это не приводит к двойному переполнению?
#include <float.h>
#include <iostream>
#include <iomanip>
#include <limits>
const size_t g_testValueCount = 10;
const double g_testValues[g_testValueCount] = { DBL_MIN, 0 };
double unsafeAverage(const double* testValues, size_t testValueCount)
{
double result = 0;
for (size_t testValueIndex = 0; testValueIndex < testValueCount; ++testValueIndex)
{
result += testValues[testValueIndex];
}
return result/testValueCount;
}
int main(int argc, char** argv)
{
std::cout << "DBL_MIN = " << std::setprecision(std::numeric_limits<double>::digits10) << DBL_MIN << std::endl;
try
{
std::cout << " AVG = " << std::setprecision(std::numeric_limits<double>::digits10) << unsafeAverage(g_testValues, g_testValueCount) << std::endl;
}
catch (...)
{
std::cout << "unsafeAverage caught an exception!" << std::endl;
}
return 0;
}
Взгляните на эту функцию: http://en.cppreference.com/w/cpp/numeric/fenv/fetestexcept 'fetestexcept' –
@TommyA -thanks, я не знал об этом. Да, флаг исключения для underflow установлен так, что это все объясняет. –