#include "Halide.h" #include <stdio.h> #include <cmath> using namespace Halide; // FIXME: Why aren't we using a unit test framework for this? void h_assert(bool condition, const char* msg) { if (!condition) { printf("FAIL: %s\n", msg); abort(); } } int main() { // Number is subnormal as a float but when converting to // half it will not be representable forcing rounding to occur const float verySmallNum = (1.0f)/(1<<25); h_assert(verySmallNum != 0.0, "smallNum should not be 0"); // This should trigger an underflow (IEEE754 7.5 Underflow) warning // // Basically if the result computed as if we had an unbounded exponent but // did the rounding would be // - subnormal // AND // - non zero // and the actual result returned (distinct from the result described above) // is not exact (i.e. rounding occurred when using the finite exponenet) // then underflow should be flagged. float16_t warning(verySmallNum, RoundingMode::ToNearestTiesToAway); h_assert(warning.to_bits() == 0x0001, "bits incorrect"); // Supress GCC's -Wunused-but-set-variable warning.is_infinity(); return 0; }