The C++ program shown below gives (when compiled under Ubuntu 16.04
using g++ in c++11 mode) the output
MATH_ERRNO is set
MATH_ERREXCEPT is set
2^2000 = inf
ERROR: numerical overflow
2^2000 = inf
no error
1/2^2000 = 0
ERROR: numerical underflow
1/2^2000 = 0
no error
Whereas the expected output is
MATH_ERRNO is set
MATH_ERREXCEPT is set
2^2000 = inf
ERROR: numerical overflow
2^2000 = inf
ERROR: numerical overflow
1/2^2000 = 0
ERROR: numerical underflow
1/2^2000 = 0
ERROR: numerical underflow
Replacing g++ by clang++ (version 3.8) or icpc (version 16.0.2) gives correct
results. Here, the test program follows:
#pragma STDC FENV_ACCESS ON
#include <cstdlib>
#include <iostream>
#include <cfenv>
#include <cmath>
void test_fp_exceptions() {
bool error=false;
if (std::fetestexcept(FE_DIVBYZERO)) {
error=true;
std::cerr << "ERROR: division by zero\n";
}
if (std::fetestexcept(FE_OVERFLOW)) {
error=true;
std::cerr << "ERROR: numerical overflow\n";
}
if (std::fetestexcept(FE_UNDERFLOW)) {
error=true;
std::cerr << "ERROR: numerical underflow\n";
}
if (std::fetestexcept(FE_INVALID)) {
error=true;
std::cerr << "ERROR: invalid result\n";
}
if (not error)
std::cerr << "no error\n";
std::feclearexcept(FE_ALL_EXCEPT);
std::cerr << '\n';
}
int main() {
std::cout << "MATH_ERRNO is "
<< (math_errhandling & MATH_ERRNO ? "set" : "not set") << '\n'
<< "MATH_ERREXCEPT is "
<< (math_errhandling & MATH_ERREXCEPT ? "set" : "not set") << '\n'
<< '\n';
std::feclearexcept(FE_ALL_EXCEPT);
std::cout << "2^2000 = " << std::pow(2., 2000) << '\n';
test_fp_exceptions();
std::cout << "2^2000 = " << std::pow(2., 2000.) << '\n';
test_fp_exceptions();
std::cout << "1/2^2000 = " << std::pow(2., -2000) << '\n';
test_fp_exceptions();
std::cout << "1/2^2000 = " << std::pow(2., -2000.) << '\n';
test_fp_exceptions();
return EXIT_SUCCESS;
}
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/429113
Title:
libm pow() function does not report floating point underflow exception
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/429113/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs