1c4762a1bSJed Brown static char help[] = "Tests PetscIsCloseAtTol() routine.\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscsys.h> 4c4762a1bSJed Brown 5c4762a1bSJed Brown PETSC_INTERN PetscReal zero; 6c4762a1bSJed Brown PetscReal zero = 0; 774ac20f2SStefano Zampini PETSC_INTERN PetscReal zero2; 874ac20f2SStefano Zampini PetscReal zero2 = 0; 9c4762a1bSJed Brown 109566063dSJacob Faibussowitsch #define CALL(call) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "%s -> %s\n", #call, (call) ? "True" : "False")) 11c4762a1bSJed Brown 12d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 13d71ae5a4SJacob Faibussowitsch { 14c4762a1bSJed Brown PetscReal eps = PETSC_MACHINE_EPSILON; 15c4762a1bSJed Brown PetscReal neg_zero = PetscRealConstant(-0.0); 16c4762a1bSJed Brown PetscReal pos_zero = PetscRealConstant(+0.0); 17c4762a1bSJed Brown PetscReal neg_one = PetscRealConstant(-1.0); 18c4762a1bSJed Brown PetscReal pos_one = PetscRealConstant(+1.0); 19c4762a1bSJed Brown PetscReal neg_inf = neg_one / zero; /* -inf */ 20c4762a1bSJed Brown PetscReal pos_inf = pos_one / zero; /* +inf */ 2174ac20f2SStefano Zampini PetscReal x_nan = zero2 / zero; /* NaN */ /* some compilers may optimize out zero/zero and set x_nan = 1! */ 22c4762a1bSJed Brown 23327415f7SBarry Smith PetscFunctionBeginUser; 249566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 25c4762a1bSJed Brown 26c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_zero, neg_zero, 0, 0)); 27c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one, pos_one, 0, 0)); 28c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one, neg_one, 0, 0)); 29c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one, neg_one, 0, 2)); 30c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one, neg_one, 2, 0)); 31c4762a1bSJed Brown 32c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one + eps, pos_one, 0, 0)); 33c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one - eps, pos_one, 0, 0)); 34c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one + eps, pos_one, 0, 0)); 35c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one - eps, pos_one, 0, 0)); 36c4762a1bSJed Brown 37c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one + eps, pos_one, 0, eps)); 38c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one - eps, pos_one, 0, eps)); 39c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one + eps, pos_one, eps, 0)); 40c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one - eps, pos_one, eps, 0)); 41c4762a1bSJed Brown 42c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one + 2 * eps, pos_one, eps, 0)); 43c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one - 2 * eps, pos_one, eps, 0)); 44c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one + 2 * eps, pos_one, 0, eps)); 45c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_one - 2 * eps, pos_one, 0, eps)); 46c4762a1bSJed Brown 47c4762a1bSJed Brown CALL(PetscIsCloseAtTol(neg_inf, neg_zero, 2, 2)); 48c4762a1bSJed Brown CALL(PetscIsCloseAtTol(neg_inf, pos_zero, 2, 2)); 49c4762a1bSJed Brown CALL(PetscIsCloseAtTol(neg_inf, neg_one, 2, 2)); 50c4762a1bSJed Brown CALL(PetscIsCloseAtTol(neg_inf, pos_one, 2, 2)); 51c4762a1bSJed Brown CALL(PetscIsCloseAtTol(neg_inf, neg_inf, 2, 2)); 52c4762a1bSJed Brown CALL(PetscIsCloseAtTol(neg_inf, pos_inf, 2, 2)); 53c4762a1bSJed Brown CALL(PetscIsCloseAtTol(neg_inf, x_nan, 2, 2)); 54c4762a1bSJed Brown 55c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_inf, neg_zero, 2, 2)); 56c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_inf, pos_zero, 2, 2)); 57c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_inf, neg_one, 2, 2)); 58c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_inf, pos_one, 2, 2)); 59c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_inf, neg_inf, 2, 2)); 60c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_inf, pos_inf, 2, 2)); 61c4762a1bSJed Brown CALL(PetscIsCloseAtTol(pos_inf, x_nan, 2, 2)); 62c4762a1bSJed Brown 63c4762a1bSJed Brown CALL(PetscIsCloseAtTol(x_nan, neg_zero, 2, 2)); 64c4762a1bSJed Brown CALL(PetscIsCloseAtTol(x_nan, pos_zero, 2, 2)); 65c4762a1bSJed Brown CALL(PetscIsCloseAtTol(x_nan, neg_one, 2, 2)); 66c4762a1bSJed Brown CALL(PetscIsCloseAtTol(x_nan, pos_one, 2, 2)); 67c4762a1bSJed Brown CALL(PetscIsCloseAtTol(x_nan, neg_inf, 2, 2)); 68c4762a1bSJed Brown CALL(PetscIsCloseAtTol(x_nan, pos_inf, 2, 2)); 69c4762a1bSJed Brown CALL(PetscIsCloseAtTol(x_nan, x_nan, 2, 2)); 70c4762a1bSJed Brown 719566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 72b122ec5aSJacob Faibussowitsch return 0; 73c4762a1bSJed Brown } 74c4762a1bSJed Brown 75c4762a1bSJed Brown /*TEST 76c4762a1bSJed Brown 77c4762a1bSJed Brown test: 78*c4cfd3bbSStefano Zampini args: -fp_trap 0 79c4762a1bSJed Brown output_file: output/ex39.out 80c4762a1bSJed Brown 81c4762a1bSJed Brown TEST*/ 82