11b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj#include <fenv.h> 21b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj#include <limits.h> 31b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj#include <math.h> 41b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj#include <stdint.h> 51b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj#include <stdio.h> 61b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 71b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanjstatic void DivideByZero() { 81b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj // volatile to prevent compiler optimizations. 91b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj volatile float zero = 0.0f; 101b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj volatile float result __attribute__((unused)) = 123.0f / zero; 111b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj} 121b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 131b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanjint main () { 141b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj /* Testing lrint. */ 151b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj fesetround(FE_UPWARD); // lrint/lrintf/lrintl obey the rounding mode. 161b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("fesetround(FE_UPWARD)\n"); 171b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("lrint(1234.01): %ld\n", lrint(1234.01)); 181b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f)); 191b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("lrintl(1234.01): %ld\n", lrintl(1234.01)); 201b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj fesetround(FE_TOWARDZERO); // lrint/lrintf/lrintl obey the rounding mode. 211b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("fesetround(FE_TOWARDZERO)\n"); 221b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("lrint(1234.01): %ld\n", lrint(1234.01)); 231b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f)); 241b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("lrintl(1234.01): %ld\n", lrintl(1234.01)); 251b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj fesetround(FE_UPWARD); // llrint/llrintf/llrintl obey the rounding mode. 261b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("fesetround(FE_UPWARD)\n"); 271b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("llrint(1234.01): %lld\n", llrint(1234.01)); 281b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f)); 291b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("llrintf(1234.01f): %lld\n", llrintl(1234.01)); 301b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj fesetround(FE_TOWARDZERO); // llrint/llrintf/llrintl obey the rounding mode. 311b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("fesetround(FE_TOWARDZERO)\n"); 321b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("llrint(1234.01): %lld\n", llrint(1234.01)); 331b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f)); 341b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("llrintl(1234.01): %lld\n", llrintl(1234.01)); 351b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 361b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj /* Tesing rint. */ 371b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj fesetround(FE_UPWARD); // rint/rintf/rintl obey the rounding mode. 381b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("fesetround(FE_UPWARD)\n"); 391b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag. 401b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("feclearexcept(FE_ALL_EXCEPT)\n"); 411b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("rint(1234.0): %f\n", rint(1234.0)); 421b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 431b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 441b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("rint(1234.01): %f\n", rint(1234.01)); 451b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 461b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 471b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 481b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag. 491b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("feclearexcept(FE_ALL_EXCEPT)\n"); 501b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("rintf(1234.0f): %f\n", rintf(1234.0f)); 511b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 521b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 531b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("rintf(1234.01f): %f\n", rintf(1234.01f)); 541b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 551b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 561b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 571b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag. 581b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("feclearexcept(FE_ALL_EXCEPT)\n"); 591b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("rintl(1234.0): %Lf\n", rintl(1234.0)); 601b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 611b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 621b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("rintl(1234.01): %Lf\n", rintl(1234.01)); 631b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 641b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 651b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 661b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj fesetround(FE_TOWARDZERO); // rint/rintf obey the rounding mode. 671b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("fesetround(FE_TOWARDZERO)\n"); 681b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("rint(1234.01): %f\n", rint(1234.01)); 691b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("rintf(1234.01f): %f\n", rintf(1234.01f)); 701b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("rintl(1234.01): %Lf\n", rintl(1234.01)); 711b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 721b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj /* Testing nearbyint. */ 731b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj fesetround(FE_UPWARD); // nearbyint/nearbyintf/nearbyintl obey the rounding mode. 741b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("fesetround(FE_UPWARD)\n"); 751b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag. 761b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("feclearexcept(FE_ALL_EXCEPT)\n"); 771b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("nearbyint(1234.0): %f\n", nearbyint(1234.0)); 781b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("nearbyint(1234.01): %f\n", nearbyint(1234.01)); 791b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 801b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj feclearexcept(FE_ALL_EXCEPT); 811b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("feclearexcept(FE_ALL_EXCEPT)\n"); 821b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("nearbyintf(1234.0f): %f\n", nearbyintf(1234.0f)); 831b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f)); 841b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 851b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag. 861b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("feclearexcept(FE_ALL_EXCEPT)\n"); 871b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("nearbyintl(1234.0f): %Lf\n", nearbyintl(1234.0f)); 881b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("nearbyintl(1234.01f): %Lf\n", nearbyintl(1234.01f)); 891b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 901b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj fesetround(FE_TOWARDZERO); // nearbyint/nearbyintf/nearbyintl obey the rounding mode. 911b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("fesetround(FE_TOWARDZERO)\n"); 921b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("nearbyint(1234.01): %f\n", nearbyint(1234.01)); 931b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f)); 941b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("nearbyintl(1234.01): %Lf\n", nearbyintl(1234.01)); 951b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 961b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj /* Test log. */ 971b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("log(M_E): %lf\n", log(M_E)); 981b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 991b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj /* Test tgamma. */ 1001b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("tgamma(5.0): %lf\n", tgamma(5.0)); 1011b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 1021b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj /* Test cbrt. */ 1031b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("cbrt(27.0): %lf\n", cbrt(27.0)); 1041b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 1051b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj /* Test dividing by zero. */ 1061b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj // Clearing clears. 1071b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("feclearexcept(FE_ALL_EXCEPT): %d\n", feclearexcept(FE_ALL_EXCEPT)); 1081b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 1091b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj // Dividing by zero sets FE_DIVBYZERO. 1101b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj DivideByZero(); 1111b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj int raised = fetestexcept(FE_DIVBYZERO | FE_OVERFLOW); 1121b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj printf("raised: %d\n", raised); 1131b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj 1141b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj return 0; 1151b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj} 116