mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 13:10:12 +03:00
239 lines
4.2 KiB
D
239 lines
4.2 KiB
D
/* 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;
|
|
}
|