1bd2b07b1SBarry Smith 2bd2b07b1SBarry Smith static char help[] = "Tests not trapping an underflow\n\n"; 3bd2b07b1SBarry Smith 4bd2b07b1SBarry Smith #include <petscsys.h> 5bd2b07b1SBarry Smith #include <float.h> 6bd2b07b1SBarry Smith #include <math.h> 7bd2b07b1SBarry Smith 8bd2b07b1SBarry Smith /* From https://stackoverflow.com/questions/37193363/float-underflow-in-c-explanation */ 9*d71ae5a4SJacob Faibussowitsch void demo(void) 10*d71ae5a4SJacob Faibussowitsch { 11bd2b07b1SBarry Smith /* 12bd2b07b1SBarry Smith FLT_MIN, FLT_MIN and the display of the floating point numbers are not portable 13bd2b07b1SBarry Smith 14bd2b07b1SBarry Smith const char *format = "%.10e %a\n"; 15bd2b07b1SBarry Smith printf(format, FLT_MIN, FLT_MIN); 16bd2b07b1SBarry Smith printf(format, FLT_TRUE_MIN, FLT_TRUE_MIN); 17bd2b07b1SBarry Smith */ 18bd2b07b1SBarry Smith 19bd2b07b1SBarry Smith float f = nextafterf(1.0f, 2.0f); 20bd2b07b1SBarry Smith do { 21bd2b07b1SBarry Smith /* if trapping of underflow is turned on then this will generate an exception */ 22bd2b07b1SBarry Smith f /= 2; 23bd2b07b1SBarry Smith /* printf(format, f, f); */ 24bd2b07b1SBarry Smith } while (f); 25bd2b07b1SBarry Smith } 26bd2b07b1SBarry Smith 27*d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 28*d71ae5a4SJacob Faibussowitsch { 29bd2b07b1SBarry Smith PetscFunctionBeginUser; 30bd2b07b1SBarry Smith PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 31bd2b07b1SBarry Smith demo(); 32bd2b07b1SBarry Smith PetscCall(PetscFinalize()); 33bd2b07b1SBarry Smith return 0; 34bd2b07b1SBarry Smith } 35bd2b07b1SBarry Smith 36bd2b07b1SBarry Smith /*TEST 37bd2b07b1SBarry Smith 38bd2b07b1SBarry Smith test: 39bd2b07b1SBarry Smith TODO: Doesn't work on AArch64 targets. There's a known hardware limitation. arch-ci-linux-cmplx-single 40bd2b07b1SBarry Smith args: -fp_trap 41bd2b07b1SBarry Smith 42bd2b07b1SBarry Smith TEST*/ 43