xref: /petsc/src/sys/tests/ex59.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
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