任何人都可以解釋爲什麼這段代碼不會產生下溢異常(在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,我沒有意識到這一點。是的,下溢的異常標誌被設置,這就解釋了一切。 –