1a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <fenv.h> 2a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <limits.h> 3a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <math.h> 4a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <stdint.h> 5a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <stdio.h> 6a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 7a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void DivideByZero() { 8a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // volatile to prevent compiler optimizations. 9a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes volatile float zero = 0.0f; 10a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes volatile float result __attribute__((unused)) = 123.0f / zero; 11a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 12a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 13a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesint main () { 14a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* Testing lrint. */ 15a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fesetround(FE_UPWARD); // lrint/lrintf/lrintl obey the rounding mode. 16a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("fesetround(FE_UPWARD)\n"); 17a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("lrint(1234.01): %ld\n", lrint(1234.01)); 18a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f)); 19a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("lrintl(1234.01): %ld\n", lrintl(1234.01)); 20a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fesetround(FE_TOWARDZERO); // lrint/lrintf/lrintl obey the rounding mode. 21a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("fesetround(FE_TOWARDZERO)\n"); 22a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("lrint(1234.01): %ld\n", lrint(1234.01)); 23a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f)); 24a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("lrintl(1234.01): %ld\n", lrintl(1234.01)); 25a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fesetround(FE_UPWARD); // llrint/llrintf/llrintl obey the rounding mode. 26a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("fesetround(FE_UPWARD)\n"); 27a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("llrint(1234.01): %lld\n", llrint(1234.01)); 28a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f)); 29a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("llrintf(1234.01f): %lld\n", llrintl(1234.01)); 30a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fesetround(FE_TOWARDZERO); // llrint/llrintf/llrintl obey the rounding mode. 31a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("fesetround(FE_TOWARDZERO)\n"); 32a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("llrint(1234.01): %lld\n", llrint(1234.01)); 33a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f)); 34a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("llrintl(1234.01): %lld\n", llrintl(1234.01)); 35a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 36a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* Tesing rint. */ 37a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fesetround(FE_UPWARD); // rint/rintf/rintl obey the rounding mode. 38a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("fesetround(FE_UPWARD)\n"); 39a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag. 40a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("feclearexcept(FE_ALL_EXCEPT)\n"); 41a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("rint(1234.0): %f\n", rint(1234.0)); 42a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 43a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 44a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("rint(1234.01): %f\n", rint(1234.01)); 45a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 46a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 47a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 48a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag. 49a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("feclearexcept(FE_ALL_EXCEPT)\n"); 50a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("rintf(1234.0f): %f\n", rintf(1234.0f)); 51a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 52a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 53a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("rintf(1234.01f): %f\n", rintf(1234.01f)); 54a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 55a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 56a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 57a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag. 58a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("feclearexcept(FE_ALL_EXCEPT)\n"); 59a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("rintl(1234.0): %Lf\n", rintl(1234.0)); 60a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 61a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 62a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("rintl(1234.01): %Lf\n", rintl(1234.01)); 63a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n", 64a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT)); 65a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 66a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fesetround(FE_TOWARDZERO); // rint/rintf obey the rounding mode. 67a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("fesetround(FE_TOWARDZERO)\n"); 68a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("rint(1234.01): %f\n", rint(1234.01)); 69a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("rintf(1234.01f): %f\n", rintf(1234.01f)); 70a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("rintl(1234.01): %Lf\n", rintl(1234.01)); 71a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 72a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* Testing nearbyint. */ 73a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fesetround(FE_UPWARD); // nearbyint/nearbyintf/nearbyintl obey the rounding mode. 74a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("fesetround(FE_UPWARD)\n"); 75a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag. 76a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("feclearexcept(FE_ALL_EXCEPT)\n"); 77a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("nearbyint(1234.0): %f\n", nearbyint(1234.0)); 78a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("nearbyint(1234.01): %f\n", nearbyint(1234.01)); 79a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 80a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes feclearexcept(FE_ALL_EXCEPT); 81a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("feclearexcept(FE_ALL_EXCEPT)\n"); 82a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("nearbyintf(1234.0f): %f\n", nearbyintf(1234.0f)); 83a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f)); 84a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 85a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag. 86a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("feclearexcept(FE_ALL_EXCEPT)\n"); 87a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("nearbyintl(1234.0f): %Lf\n", nearbyintl(1234.0f)); 88a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("nearbyintl(1234.01f): %Lf\n", nearbyintl(1234.01f)); 89a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 90a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fesetround(FE_TOWARDZERO); // nearbyint/nearbyintf/nearbyintl obey the rounding mode. 91a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("fesetround(FE_TOWARDZERO)\n"); 92a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("nearbyint(1234.01): %f\n", nearbyint(1234.01)); 93a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f)); 94a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("nearbyintl(1234.01): %Lf\n", nearbyintl(1234.01)); 95a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 96a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* Test log. */ 97a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("log(M_E): %lf\n", log(M_E)); 98a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 99a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* Test tgamma. */ 100a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("tgamma(5.0): %lf\n", tgamma(5.0)); 101a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 102a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* Test cbrt. */ 103a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("cbrt(27.0): %lf\n", cbrt(27.0)); 104a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 105a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* Test dividing by zero. */ 106a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // Clearing clears. 107a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("feclearexcept(FE_ALL_EXCEPT): %d\n", feclearexcept(FE_ALL_EXCEPT)); 108a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 109a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // Dividing by zero sets FE_DIVBYZERO. 110a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes DivideByZero(); 111a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int raised = fetestexcept(FE_DIVBYZERO | FE_OVERFLOW); 112a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("raised: %d\n", raised); 113a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 114a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return 0; 115a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 116