1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
/*
** subnormal-boundary.c
**
** Martin Brain
** martin.brain@cs.ox.ac.uk
** 25/07/12
**
** Regression tests for casting and classification around the subnormal boundary.
**
*/
#include <assert.h>
#include <math.h>
float nondet_float(void);
int main (void)
{
#ifdef __GNUC__
float smallestNormalFloat = 0x1.0p-126f;
float largestSubnormalFloat = 0x1.fffffcp-127f;
double v = 0x1.FFFFFFp-127;
float f;
// Check the encodings are correct
assert(fpclassify(largestSubnormalFloat) == FP_SUBNORMAL);
f = nondet_float();
__CPROVER_assume(fpclassify(f) == FP_SUBNORMAL);
assert(f <= largestSubnormalFloat);
assert(fpclassify(smallestNormalFloat) == FP_NORMAL);
f = nondet_float();
__CPROVER_assume(fpclassify(f) == FP_NORMAL);
assert(smallestNormalFloat <= fabs(f));
assert(largestSubnormalFloat < smallestNormalFloat);
// Check the ordering as doubles
assert(((double)largestSubnormalFloat) < ((double)smallestNormalFloat));
assert(((double)largestSubnormalFloat) < v);
assert(v < ((double)smallestNormalFloat));
// Check coercion to float
assert((float)((double)largestSubnormalFloat) == largestSubnormalFloat);
assert((float)((double)smallestNormalFloat) == smallestNormalFloat);
assert(((double)smallestNormalFloat) - v <= v - ((double)largestSubnormalFloat));
assert(((float)v) == smallestNormalFloat);
f = nondet_float();
__CPROVER_assume(fpclassify(f) == FP_SUBNORMAL);
assert( ((float)((double)f)) == f );
#endif
return 0;
}
|