| import core.stdc.stdio; |
| |
| enum real er1 = real.nan; |
| enum real er2 = 1; |
| static assert(er1 != er2); |
| static assert(!(er1 == er2)); |
| static assert(!(er1 < er2)); |
| static assert(!(er1 > er2)); |
| static assert(!(er1 >= er2)); |
| static assert(!(er1 <= er2)); |
| |
| enum double ed1 = real.nan; |
| enum double ed2 = 1; |
| static assert(ed1 != ed2); |
| static assert(!(ed1 == ed2)); |
| static assert(!(ed1 < ed2)); |
| static assert(!(ed1 > ed2)); |
| static assert(!(ed1 >= ed2)); |
| static assert(!(ed1 <= ed2)); |
| |
| bool b; |
| |
| |
| T byCTFE(T)() |
| { |
| T x; |
| return x; |
| } |
| |
| bool bittst(const ubyte[] ba, uint pos) |
| { |
| uint mask = 1 << (pos % 8); |
| version(LittleEndian) |
| return (ba[pos / 8] & mask) != 0; |
| else |
| return (ba[$ - 1 - pos / 8] & mask) != 0; |
| } |
| |
| void test2(T)() |
| { |
| T a = T.init, b = T.nan; |
| assert(a is b); |
| |
| enum c = byCTFE!T(); |
| assert(a is c); |
| |
| static if (T.mant_dig == 64 && T.max_exp == 16384) |
| { |
| enum size = 10; // x87, exclude padding |
| enum mant_dig = T.mant_dig; |
| } |
| else static if (T.mant_dig == 106) |
| { |
| enum size = 8; // IBM, only look at first index |
| enum mant_dig = 53; |
| } |
| else |
| { |
| enum size = T.sizeof; |
| enum mant_dig = T.mant_dig; |
| } |
| const pa = (cast(ubyte*) &a)[0 .. size]; |
| |
| // the highest 2 bits of the mantissa should be set, everything else zero |
| assert(bittst(pa, mant_dig - 1)); |
| assert(bittst(pa, mant_dig - 2)); |
| foreach(p; 0..mant_dig - 2) |
| assert(!bittst(pa, p)); |
| } |
| |
| bool test() |
| { |
| real r1 = real.nan; |
| real r2 = 1; |
| b = (r1 != r2); assert(b); |
| b = (r1 == r2); assert(!b); |
| b = (r1 < r2); assert(!b); |
| b = (r1 > r2); assert(!b); |
| b = (r1 <= r2); assert(!b); |
| b = (r1 >= r2); assert(!b); |
| |
| double d1 = double.nan; |
| double d2 = 1; |
| b = (d1 != d2); assert(b); |
| b = (d1 == d2); assert(!b); |
| b = (d1 < d2); assert(!b); |
| b = (d1 > d2); assert(!b); |
| b = (d1 <= d2); assert(!b); |
| b = (d1 >= d2); assert(!b); |
| |
| float f1 = float.nan; |
| float f2 = 1; |
| b = (f1 != f2); assert(b); |
| b = (f1 == f2); assert(!b); |
| b = (f1 < f2); assert(!b); |
| b = (f1 > f2); assert(!b); |
| b = (f1 <= f2); assert(!b); |
| b = (f1 >= f2); assert(!b); |
| return true; |
| } |
| |
| void main() |
| { |
| assert(test()); |
| test2!float(); |
| test2!double(); |
| test2!real(); |
| } |