#include <fenv.h> #include <limits.h> #include <math.h> #include <stdint.h> #include <stdio.h> static void DivideByZero() { // volatile to prevent compiler optimizations. volatile float zero = 0.0f; volatile float result __attribute__((unused)) = 123.0f / zero; } int main () { /* Testing lrint. */ fesetround(FE_UPWARD); // lrint/lrintf/lrintl obey the rounding mode. printf("fesetround(FE_UPWARD)\n"); printf("lrint(1234.01): %ld\n", lrint(1234.01)); printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f)); printf("lrintl(1234.01): %ld\n", lrintl(1234.01)); fesetround(FE_TOWARDZERO); // lrint/lrintf/lrintl obey the rounding mode. printf("fesetround(FE_TOWARDZERO)\n"); printf("lrint(1234.01): %ld\n", lrint(1234.01)); printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f)); printf("lrintl(1234.01): %ld\n", lrintl(1234.01)); fesetround(FE_UPWARD); // llrint/llrintf/llrintl obey the rounding mode. printf("fesetround(FE_UPWARD)\n"); printf("llrint(1234.01): %lld\n", llrint(1234.01)); printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f)); printf("llrintf(1234.01f): %lld\n", llrintl(1234.01)); fesetround(FE_TOWARDZERO); // llrint/llrintf/llrintl obey the rounding mode. printf("fesetround(FE_TOWARDZERO)\n"); printf("llrint(1234.01): %lld\n", llrint(1234.01)); printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f)); printf("llrintl(1234.01): %lld\n", llrintl(1234.01)); /* Tesing rint. */ fesetround(FE_UPWARD); // rint/rintf/rintl obey the rounding mode. printf("fesetround(FE_UPWARD)\n"); feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag. printf("feclearexcept(FE_ALL_EXCEPT)\n"); printf("rint(1234.0): %f\n", rint(1234.0)); printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); printf("rint(1234.01): %f\n", rint(1234.01)); printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag. printf("feclearexcept(FE_ALL_EXCEPT)\n"); printf("rintf(1234.0f): %f\n", rintf(1234.0f)); printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); printf("rintf(1234.01f): %f\n", rintf(1234.01f)); printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag. printf("feclearexcept(FE_ALL_EXCEPT)\n"); printf("rintl(1234.0): %Lf\n", rintl(1234.0)); printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); printf("rintl(1234.01): %Lf\n", rintl(1234.01)); printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); fesetround(FE_TOWARDZERO); // rint/rintf obey the rounding mode. printf("fesetround(FE_TOWARDZERO)\n"); printf("rint(1234.01): %f\n", rint(1234.01)); printf("rintf(1234.01f): %f\n", rintf(1234.01f)); printf("rintl(1234.01): %Lf\n", rintl(1234.01)); /* Testing nearbyint. */ fesetround(FE_UPWARD); // nearbyint/nearbyintf/nearbyintl obey the rounding mode. printf("fesetround(FE_UPWARD)\n"); feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag. printf("feclearexcept(FE_ALL_EXCEPT)\n"); printf("nearbyint(1234.0): %f\n", nearbyint(1234.0)); printf("nearbyint(1234.01): %f\n", nearbyint(1234.01)); feclearexcept(FE_ALL_EXCEPT); printf("feclearexcept(FE_ALL_EXCEPT)\n"); printf("nearbyintf(1234.0f): %f\n", nearbyintf(1234.0f)); printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f)); feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag. printf("feclearexcept(FE_ALL_EXCEPT)\n"); printf("nearbyintl(1234.0f): %Lf\n", nearbyintl(1234.0f)); printf("nearbyintl(1234.01f): %Lf\n", nearbyintl(1234.01f)); fesetround(FE_TOWARDZERO); // nearbyint/nearbyintf/nearbyintl obey the rounding mode. printf("fesetround(FE_TOWARDZERO)\n"); printf("nearbyint(1234.01): %f\n", nearbyint(1234.01)); printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f)); printf("nearbyintl(1234.01): %Lf\n", nearbyintl(1234.01)); /* Test log. */ printf("log(M_E): %lf\n", log(M_E)); /* Test tgamma. */ printf("tgamma(5.0): %lf\n", tgamma(5.0)); /* Test cbrt. */ printf("cbrt(27.0): %lf\n", cbrt(27.0)); /* Test dividing by zero. */ // Clearing clears. printf("feclearexcept(FE_ALL_EXCEPT): %d\n", feclearexcept(FE_ALL_EXCEPT)); // Dividing by zero sets FE_DIVBYZERO. DivideByZero(); int raised = fetestexcept(FE_DIVBYZERO | FE_OVERFLOW); printf("raised: %d\n", raised); return 0; }