| /* PERMUTE_ARGS: -O |
| * Test floating point code generation |
| */ |
| |
| import core.stdc.stdio; |
| import core.stdc.stdlib; |
| |
| double value_1() { |
| return 1; |
| } |
| |
| double value_2() { |
| return 2; |
| } |
| |
| /***************************************/ |
| |
| void testcse1(T)() // common subexpressions |
| { |
| T a = value_1(); |
| T b = value_2(); |
| T x = a*a + a*a + a*a + a*a + a*a + a*a + a*a + |
| a*b + a*b; |
| printf("%g\n", cast(double)x); // destroy scratch reg contents |
| T y = a*a + a*a + a*a + a*a + a*a + a*a + a*a + |
| a*b + a*b; |
| assert(x == 11); |
| assert(x == y); |
| } |
| |
| void test240() |
| { |
| testcse1!float(); |
| testcse1!double(); |
| testcse1!real(); |
| } |
| |
| /***************************************/ |
| |
| void testcse2(T)() // common subexpressions |
| { |
| T a = value_1(); |
| T b = value_2(); |
| T x = a*a + a*a + a*a + a*a + a*a + a*a + a*a + |
| a*b + a*b + 1; |
| printf("%g\n", cast(double)x); // destroy scratch reg contents |
| int i = (a*a + a*a + a*a + a*a + a*a + a*a + a*a + a*b + a*b) != 0; |
| assert(i); |
| assert(x == 12); |
| } |
| |
| void test241() |
| { |
| testcse2!float(); |
| testcse2!double(); |
| testcse2!real(); |
| } |
| |
| /***************************************/ |
| |
| void test1(float f) |
| { |
| real r = f; |
| double d = f; |
| } |
| |
| void test2(long l) |
| { |
| real r = l; |
| double d = l; |
| } |
| |
| void test3(float f) |
| { |
| real r = f * f; |
| double d = f * f; |
| } |
| |
| void test3(long l) |
| { |
| real r = l * l; |
| double d = l * l; |
| } |
| |
| /***************************************/ |
| |
| double foo4(int i, double d) |
| { |
| return ((i << 1) - d) + ((i << 1) - d); |
| } |
| |
| void test4() |
| { |
| double d = foo4(3, 4); |
| assert(d == 4); |
| } |
| |
| /***************************************/ |
| |
| import core.math; // trigger use of sqrt intrinsic |
| |
| void test5x(double p) |
| { |
| bool b = p >= 0; |
| double mean = (1 - p) / p; |
| double skew = sqrt(1 - p); |
| } |
| |
| void test5() |
| { |
| test5x(2); |
| } |
| |
| /***************************************/ |
| |
| import core.math; // trigger use of sqrt intrinsic |
| |
| void dstatsEnforce(bool, string) { } |
| |
| ulong invNegBinomCDF(double pVal, ulong n, double p) |
| { |
| dstatsEnforce(p >= 0 && p <= 1, |
| "p must be between 0, 1 for negative binomial distribution."); |
| dstatsEnforce(pVal >= 0 && pVal <= 1, |
| "P-values must be between 0, 1."); |
| |
| // Normal or gamma approx, then adjust. |
| double mean = n * (1 - p) / p; |
| double var = n * (1 - p) / (p * p); |
| double skew = (2 - p) / sqrt(n * (1 - p)); |
| double kk = 4.0L / (skew * skew); |
| double theta = sqrt(var / kk); |
| double offset = (kk * theta) - mean + 0.5L; |
| ulong guess; |
| return 0; |
| } |
| |
| void test6() |
| { |
| invNegBinomCDF(2.0, 3, 4.0); |
| } |
| |
| /***************************************/ |
| |
| float expDigamma(F)(in F x) |
| { |
| return x; |
| } |
| |
| float nextDown(float f) { return f; } |
| |
| void test7() |
| { |
| foreach (i; 1 .. 2) |
| { |
| assert(expDigamma(float(i)) >= expDigamma(float(i).nextDown)); |
| } |
| } |
| |
| /***************************************/ |
| |
| void foo8_1(double x) |
| { |
| printf("x = %g\n", x); |
| assert(x == 0); |
| } |
| |
| void foo8_2(double x) |
| { |
| printf("x = %g\n", x); |
| assert(x != 0); |
| } |
| |
| void test8() |
| { |
| foo8_1(0.0); |
| foo8_2(1.0); |
| } |
| |
| /***************************************/ |
| |
| void test9() |
| { |
| double a = 9; |
| double b = 3; |
| double c = a * b + 1; |
| double d = a + b + 1; |
| printf("%g %g\n", c, d); // clobber XMM registers |
| assert(c == 28 && d == 13); |
| double e = a * b - 1; |
| double f = a + b - 1; // reload 2 CSEs |
| printf("%g %g\n", e, f); |
| assert(e == 26 && f == 11); |
| } |
| |
| /***************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=20349 |
| |
| double f20349(double a, int b) |
| { |
| import core.math; |
| return core.math.sqrt(-a / b) / b; |
| } |
| |
| void test20349() |
| { |
| assert(f20349(-9, 1) == 3); |
| } |
| |
| /****************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=20963 |
| |
| void test20963() |
| { |
| ulong v = 0xE3251BACB112CB8B; |
| double d = cast(double)v; |
| printf("%a\n", d); //0x1.c64a37596225ap+63 |
| assert(d == 0x1.c64a375962259p+63); |
| } |
| |
| /***************************************/ |
| |
| |
| int main() |
| { |
| test240(); |
| test241(); |
| test4(); |
| test5(); |
| test6(); |
| test7(); |
| test8(); |
| test9(); |
| test20349(); |
| test20963(); |
| |
| printf("Success\n"); |
| return EXIT_SUCCESS; |
| } |