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