| /* |
| REQUIRED_ARGS: -d |
| TEST_OUTPUT: |
| --- |
| --- |
| */ |
| |
| import core.stdc.math : isnan, signbit; |
| import core.stdc.stdio; |
| |
| template AliasSeq(T...) { alias T AliasSeq; } |
| |
| /************************************/ |
| |
| static assert(-(6i) == -6i); |
| static assert(-(1 + 6i) == -1 - 6i); |
| |
| static assert(!3.7i == 0); |
| static assert(!0.0i == 1); |
| static assert(!(2+3.7i) == 0); |
| static assert(!(0+3.7i) == 0); |
| static assert(!(2+0.0i) == 0); |
| static assert(!(0+0.0i) == 1); |
| |
| static assert(-6i + 2i == -4i); |
| static assert(6i - 1i == 5i); |
| |
| static assert((3.6 + 7.2i) / (1 + 0i) == 3.6 + 7.2i); |
| static assert((3.6 + 7.2i) / (0.0 + 1i) == 7.2 - 3.6i); |
| |
| static assert((7.2i < 6.2i) == 0); |
| |
| static assert((7.2i == 6.2i) == 0); |
| static assert((7.2i != 6.2i) == 1); |
| |
| static assert((7.2i == 7.2i) == 1); |
| static assert((7.2i != 7.2i) == 0); |
| |
| static assert((5.1 is 5.1i) == 0); |
| static assert((5.1 !is 5.1i) == 1); |
| |
| /***************************************/ |
| |
| ireal f2() { return 1i; } |
| |
| void test2() |
| { |
| creal v = 0+0i; |
| |
| v += f2(); |
| assert(v == 0 + 1i); |
| |
| v = v + f2(); |
| assert(v == 0 + 2i); |
| } |
| |
| /***************************************/ |
| |
| cdouble[1] a3; |
| cdouble[1] b3; |
| |
| cdouble[] concat3() { |
| return a3~b3; |
| } |
| |
| void test3() |
| { |
| a3[]=0.5+1.0i; |
| b3[]=0.5+3.0i; |
| |
| cdouble[] arr=concat3(); |
| |
| assert(arr.length==2); |
| assert(arr[0]==0.5+1.0i); |
| assert(arr[1]==0.5+3.0i); |
| } |
| |
| /***************************************/ |
| |
| creal[1] a4; |
| creal[1] b4; |
| |
| creal[] concat4() { |
| return a4~b4; |
| } |
| |
| void test4() |
| { |
| a4[]=0.5+1.0i; |
| b4[]=0.5+3.0i; |
| |
| creal[] arr=concat4(); |
| |
| assert(arr.length==2); |
| assert(arr[0]==0.5+1.0i); |
| assert(arr[1]==0.5+3.0i); |
| } |
| |
| /***************************************/ |
| |
| void test5() |
| { |
| ifloat i=1.0fi; |
| // i += 2.2; |
| // assert(i == 1i); |
| } |
| |
| /***************************************/ |
| |
| void test6() |
| { |
| float i=1.0f; |
| // i /= 2.2fi; |
| // assert(i == 0); |
| } |
| |
| /***************************************/ |
| |
| void test7() |
| { |
| creal x=1.0i+2.0; |
| creal[] arr; |
| |
| arr = arr ~ x; |
| assert(arr.length==1); |
| assert(arr[0]==1.0i+2.0); |
| |
| x=0.0i+5.0; |
| assert(arr[0]==1.0i+2.0); |
| } |
| |
| /****************************************/ |
| |
| creal[1] a8; |
| creal[1] b8; |
| |
| creal[] concat8() { |
| return a8 ~ b8; |
| } |
| |
| void test8() |
| { |
| a8[]=0.5L+1.0Li; |
| b8[]=0.5L+3.0Li; |
| |
| creal[] arr=concat8(); |
| |
| assert(arr.length==2); |
| assert(arr[0]==0.5L+1.0Li); |
| assert(arr[1]==0.5L+3.0Li); |
| } |
| |
| /***************************************/ |
| |
| creal[1] a9; |
| creal[1] b9; |
| |
| creal[] concat9() { |
| return a9~b9; |
| } |
| |
| void test9() |
| { |
| a9[]=0.5L+1.0Li; |
| b9[]=0.5L+3.0Li; |
| |
| creal[] arr=concat9(); |
| |
| assert(arr.length==2); |
| assert(arr[0]==0.5L+1.0Li); |
| assert(arr[1]==0.5L+3.0Li); |
| } |
| |
| |
| /***************************************/ |
| |
| void test10() |
| { |
| ifloat a = 1.0i; |
| assert(a.im == 1.0); |
| |
| const ifloat b = 2.0i; |
| static assert(b.im == 2.0); // FAIL |
| |
| } |
| |
| /***************************************/ |
| |
| void test11() |
| { |
| real r = real.nan; |
| assert( r!=0 ); |
| if (r==0) assert(0); |
| |
| ireal ir = ireal.nan; |
| assert( ir!=0 ); |
| assert( ir!=0i ); |
| if (ir==0) assert(0); |
| if (ir==0i) assert(0); |
| |
| creal cr = creal.nan; |
| assert( cr!=0 ); |
| assert( cr!=0i ); |
| if (cr==0) assert(0); |
| if (cr==0i) assert(0); |
| |
| double d = double.nan; |
| assert( d!=0 ); |
| if (d==0) assert(0); |
| |
| idouble id = idouble.nan; |
| assert( id!=0 ); |
| assert( id!=0i ); |
| if (id==0) assert(0); |
| if (id==0i) assert(0); |
| |
| cdouble cd = cdouble.nan; |
| assert( cd!=0 ); |
| assert( cd!=0i ); |
| if (cd==0) assert(0); |
| if (cd==0i) assert(0); |
| |
| float f = float.nan; |
| assert( f!=0 ); |
| if (f==0) assert(0); |
| |
| ifloat ifx = ifloat.nan; |
| assert( ifx!=0 ); |
| assert( ifx!=0i ); |
| if (ifx==0) assert(0); |
| if (ifx==0i) assert(0); |
| |
| cfloat cf = cfloat.nan; |
| assert( cf!=0 ); |
| assert( cf!=0i ); |
| if (cf==0) assert(0); |
| if (cf==0i) assert(0); |
| } |
| |
| /***************************************/ |
| |
| void test12() |
| { |
| real x = 3; |
| creal a = (2 + 4i) % 3; |
| printf("%Lg %Lgi\n", a.re, a.im); |
| assert(a == 2 + 1i); |
| |
| creal b = (2 + 4i) % x; |
| printf("%Lg %Lgi\n", b.re, b.im); |
| assert(b == a); |
| } |
| |
| /***************************************/ |
| |
| void test13() |
| { |
| ireal a = 5i; |
| ireal b = a % 2; |
| printf("%Lg %Lgi\n", b.re, b.im); |
| assert(b == 1i); |
| } |
| |
| /***************************************/ |
| |
| cdouble inv( cdouble expr ) |
| { |
| return (1.0 + 0.0i) / expr; |
| } |
| |
| /***************************************/ |
| |
| void test14() |
| { |
| cfloat c; |
| cfloat d; |
| assert(c != d); |
| |
| cdouble e; |
| cdouble f; |
| assert(e != f); |
| |
| creal g; |
| creal h; |
| assert(g != h); |
| } |
| |
| /***************************************/ |
| |
| void test7581() |
| { |
| cfloat a() { return cfloat.nan; } |
| assert(a() != 0); |
| } |
| |
| /***************************************/ |
| |
| float f() { return 1.0f; } |
| ifloat i() { return 1.0fi; } |
| |
| void test7594() |
| { |
| assert(f() + i() == 1.0f + 1.0fi); |
| } |
| |
| /***************************************/ |
| |
| cdouble conv(cfloat a) |
| { |
| return a; |
| } |
| |
| void test7593() |
| { |
| assert(conv(1.0f+1.0fi) == 1.0+1.0i); |
| } |
| |
| /***************************************/ |
| |
| cfloat get() { return cfloat.nan; } |
| |
| void test7591() |
| { |
| assert(!(get() == 0)); |
| } |
| |
| /***************************************/ |
| |
| void foo8966(cfloat x) |
| { |
| assert(x.re == 3.0f); |
| } |
| |
| __gshared cfloat[] a8966; |
| |
| void test8966() |
| { |
| a8966 = new cfloat[2]; |
| a8966[0] = 3.0f + 1.0fi; |
| foo8966(a8966[0]); |
| } |
| |
| /***************************************/ |
| |
| void formatTest2(cfloat s, double re, double im) |
| { |
| assert(s.re == re); |
| assert(s.im == im); |
| } |
| |
| cfloat getcf() |
| { |
| return 2 + 1i; |
| } |
| |
| void test10677() |
| { |
| formatTest2( getcf(), 2, 1 ); |
| } |
| |
| /***************************************/ |
| |
| void test7806() |
| { |
| for (idouble i = -2i; i <= 2i; i += .125i) |
| for (double r = -2; r <= 2; r += .0625) |
| { |
| cdouble c = r + i; |
| printf("%g %gi\n", c.re, c.im); |
| } |
| } |
| |
| /***************************************/ |
| |
| void test7976() { |
| creal[] a = new creal[2]; |
| auto b = a[0] = a[1]; |
| } |
| |
| /***************************************/ |
| |
| cfloat foo15f(ifloat re, float im) |
| { |
| return re + im; |
| } |
| |
| cfloat bar15f(float re, ifloat im) |
| { |
| return re + im; |
| } |
| |
| cdouble foo15(idouble re, double im) |
| { |
| return re + im; |
| } |
| |
| cdouble bar15(double re, idouble im) |
| { |
| return re + im; |
| } |
| |
| creal foo15r(ireal re, real im) |
| { |
| return re + im; |
| } |
| |
| creal bar15r(real re, ireal im) |
| { |
| return re + im; |
| } |
| |
| void test15() |
| { |
| assert(foo15f(1.0fi, 2.0f) == 2.0f + 1.0fi); |
| assert(bar15f(1.0f, 2.0fi) == 1.0f + 2.0fi); |
| |
| assert(foo15(1.0i, 2.0) == 2.0 + 1.0i); |
| assert(bar15(1.0, 2.0i) == 1.0 + 2.0i); |
| |
| assert(foo15r(1.0Li, 2.0L) == 2.0L + 1.0Li); |
| assert(bar15r(1.0L, 2.0Li) == 1.0L + 2.0Li); |
| } |
| |
| /************************************/ |
| |
| void test16() |
| { |
| real n = -0.0; |
| const real m = -0.0; |
| |
| creal c = -0.0 + 3i; |
| creal d = n + 3i; |
| creal e = m + 3i; |
| |
| assert(signbit(c.re) != 0); |
| assert(signbit(d.re) != 0); |
| assert(signbit(e.re) != 0); |
| } |
| |
| /************************************/ |
| |
| void test17() |
| { |
| void test(cdouble v) |
| { |
| auto x2 = cdouble(v); |
| assert(x2 == v); |
| } |
| test(1.2+3.4i); |
| } |
| |
| /************************************/ |
| |
| template factorial18(float n, cdouble c, string sss, string ttt) |
| { |
| static if (n == 1) |
| const float factorial18 = 1; |
| else |
| const float factorial18 = n * 2; |
| } |
| |
| template bar18(wstring abc, dstring def) |
| { |
| const int x = 3; |
| } |
| |
| void test18() |
| { |
| float f = factorial18!(4.25, 6.8+3i, "hello", null); |
| printf("%g\n", f); |
| assert(f == 8.5); |
| int i = bar18!("abc"w, "def"d).x; |
| printf("%d\n", i); |
| assert(i == 3); |
| } |
| |
| /*****************************************/ |
| |
| void test19() |
| { |
| float f; |
| double d; |
| real r; |
| |
| if (f > ifloat.max) |
| goto Loverflow; |
| if (d > ifloat.max) |
| goto Loverflow; |
| if (r > ifloat.max) |
| goto Loverflow; |
| |
| if (ifloat.max < f) |
| goto Loverflow; |
| if (ifloat.max < d) |
| goto Loverflow; |
| if (ifloat.max < r) |
| goto Loverflow; |
| |
| return; |
| |
| Loverflow: |
| return; |
| } |
| |
| /*****************************************/ |
| |
| void test20() |
| { |
| double d = 1; |
| cdouble cd = 1+0i; |
| assert(cd == 1.0 + 0i); |
| } |
| |
| /*****************************************/ |
| |
| void test21() |
| { |
| cdouble[] a; |
| cdouble[] b; |
| foreach(ref cdouble d; b) |
| { |
| d = -a[0]; |
| for(;;){} |
| } |
| } |
| |
| /*************************************/ |
| |
| void test22() |
| { |
| static creal[] params = [1+0i, 3+0i, 5+0i]; |
| |
| printf("params[0] = %Lf + %Lfi\n", params[0].re, params[0].im); |
| printf("params[1] = %Lf + %Lfi\n", params[1].re, params[1].im); |
| printf("params[2] = %Lf + %Lfi\n", params[2].re, params[2].im); |
| |
| creal[] sums = new creal[3]; |
| sums[] = 0+0i; |
| |
| foreach(creal d; params) |
| { |
| creal prod = d; |
| |
| printf("prod = %Lf + %Lfi\n", prod.re, prod.im); |
| for(int i; i<2; i++) |
| { |
| sums[i] += prod; |
| prod *= d; |
| } |
| sums[2] += prod; |
| } |
| |
| printf("sums[0] = %Lf + %Lfi", sums[0].re, sums[0].im); |
| assert(sums[0].re==9); |
| assert(sums[0].im==0); |
| assert(sums[1].re==35); |
| assert(sums[1].im==0); |
| assert(sums[2].re==153); |
| assert(sums[2].im==0); |
| } |
| |
| /*******************************************/ |
| |
| cdouble y23; |
| |
| cdouble f23(cdouble x) |
| { |
| return (y23 = x); |
| } |
| |
| void test23() |
| { |
| f23(1.0+2.0i); |
| assert(y23 == 1.0+2.0i); |
| } |
| |
| /*************************************/ |
| |
| ifloat func_24_1(ifloat f, double d) |
| { |
| // f /= cast(cdouble)d; |
| return f; |
| } |
| |
| ifloat func_24_2(ifloat f, double d) |
| { |
| f = cast(ifloat)(f / cast(cdouble)d); |
| return f; |
| } |
| |
| float func_24_3(float f, double d) |
| { |
| // f /= cast(cdouble)d; |
| return f; |
| } |
| |
| float func_24_4(float f, double d) |
| { |
| f = cast(float)(f / cast(cdouble)d); |
| return f; |
| } |
| |
| void test24() |
| { |
| ifloat f = func_24_1(10i, 8); |
| printf("%fi\n", f); |
| // assert(f == 1.25i); |
| |
| f = func_24_2(10i, 8); |
| printf("%fi\n", f); |
| assert(f == 1.25i); |
| |
| float g = func_24_3(10, 8); |
| printf("%f\n", g); |
| // assert(g == 1.25); |
| |
| g = func_24_4(10, 8); |
| printf("%f\n", g); |
| assert(g == 1.25); |
| } |
| |
| /*******************************************/ |
| |
| void test25() |
| { |
| ireal x = 4.0Li; |
| ireal y = 4.0Li; |
| ireal z = 4Li; |
| creal c = 4L + 0Li; |
| } |
| |
| /*************************************/ |
| |
| string toString26(cdouble z) |
| { |
| char[ulong.sizeof*8] buf; |
| |
| auto len = snprintf(buf.ptr, buf.sizeof, "%f+%fi", z.re, z.im); |
| return buf[0 .. len].idup; |
| } |
| |
| void test26() |
| { |
| static cdouble[] A = [1+0i, 0+1i, 1+1i]; |
| string s; |
| |
| foreach( cdouble z; A ) |
| { |
| s = toString26(z); |
| printf("%.*s ", cast(int)s.length, s.ptr); |
| } |
| printf("\n"); |
| |
| for(int ii=0; ii<A.length; ii++ ) |
| A[ii] += -1i*A[ii]; |
| |
| assert(A[0] == 1 - 1i); |
| assert(A[1] == 1 + 1i); |
| assert(A[2] == 2); |
| |
| foreach( cdouble z; A ) |
| { |
| s = toString26(z); |
| printf("%.*s ", cast(int)s.length, s.ptr); |
| } |
| printf("\n"); |
| } |
| |
| /*************************************/ |
| |
| void test27() |
| { |
| creal z = 1. + 2.0i; |
| |
| real r = z.re; |
| assert(r == 1.0); |
| |
| real i = z.im; |
| assert(i == 2.0); |
| |
| assert(r.im == 0.0); |
| assert(r.re == 1.0); |
| |
| assert(i.re == 2.0); |
| assert(i.im == 0.0i); |
| } |
| |
| /*************************************/ |
| |
| void test28() |
| { |
| alias cdouble X; |
| X four = cast(X) (4.0i + 0.4); |
| } |
| |
| /*************************************/ |
| |
| void test29() |
| { |
| ireal a = 6.5i % 3i; |
| printf("%Lfi %Lfi\n", a, a - .5i); |
| assert(a == .5i); |
| |
| a = 6.5i % 3; |
| printf("%Lfi %Lfi\n", a, a - .5i); |
| assert(a == .5i); |
| |
| real b = 6.5 % 3i; |
| printf("%Lf %Lf\n", b, b - .5); |
| assert(b == .5); |
| |
| b = 6.5 % 3; |
| printf("%Lf %Lf\n", b, b - .5); |
| assert(b == .5); |
| } |
| |
| /*************************************/ |
| |
| void test30() |
| { |
| cfloat f = 1+0i; |
| f %= 2fi; |
| printf("%f + %fi\n", f.re, f.im); |
| assert(f == 1 + 0i); |
| |
| cdouble d = 1+0i; |
| d %= 2i; |
| printf("%f + %fi\n", d.re, d.im); |
| assert(d == 1 + 0i); |
| |
| creal r = 1+0i; |
| r %= 2i; |
| printf("%Lf + %Lfi\n", r.re, r.im); |
| assert(r == 1 + 0i); |
| } |
| |
| /*************************************/ |
| |
| void test31() |
| { |
| cfloat f = 1+0i; |
| f %= 2i; |
| printf("%f + %fi\n", f.re, f.im); |
| assert(f == 1); |
| |
| cdouble d = 1+0i; |
| d = d % 2i; |
| printf("%f + %fi\n", d.re, d.im); |
| assert(d == 1); |
| |
| creal r = 1+0i; |
| r = r % 2i; |
| printf("%Lf + %Lfi\n", r.re, r.im); |
| assert(r == 1); |
| } |
| |
| /*************************************/ |
| |
| void assertEqual(real* a, real* b, string file = __FILE__, size_t line = __LINE__) |
| { |
| auto x = cast(ubyte*)a; |
| auto y = cast(ubyte*)b; |
| |
| // Only compare the 10 value bytes, the padding bytes are of undefined |
| // value. |
| version (X86) enum count = 10; |
| else version (X86_64) enum count = 10; |
| else enum count = real.sizeof; |
| for (size_t i = 0; i < count; i++) |
| { |
| if (x[i] != y[i]) |
| { |
| printf("%02zd: %02x %02x\n", i, x[i], y[i]); |
| import core.exception; |
| throw new AssertError(file, line); |
| } |
| } |
| } |
| |
| void assertEqual(creal* a, creal* b, string file = __FILE__, size_t line = __LINE__) |
| { |
| assertEqual(cast(real*)a, cast(real*)b, file, line); |
| assertEqual(cast(real*)a + 1, cast(real*)b + 1, file, line); |
| } |
| |
| void test32() |
| { |
| creal a = creal.nan; |
| creal b = real.nan + ireal.nan; |
| assertEqual(&a, &b); |
| |
| real c= real.nan; |
| real d=a.re; |
| assertEqual(&c, &d); |
| |
| d=a.im; |
| assertEqual(&c, &d); |
| } |
| |
| /*************************************/ |
| |
| void test33() |
| { |
| creal a = creal.infinity; |
| creal b = real.infinity + ireal.infinity; |
| assertEqual(&a, &b); |
| |
| real c = real.infinity; |
| real d=a.re; |
| assertEqual(&c, &d); |
| |
| d=a.im; |
| assertEqual(&c, &d); |
| } |
| |
| /*************************************/ |
| |
| void test34() |
| { |
| creal a = creal.nan; |
| creal b = creal.nan; |
| b = real.nan + ireal.nan; |
| assertEqual(&a, &b); |
| |
| real c = real.nan; |
| real d=a.re; |
| assertEqual(&c, &d); |
| |
| d=a.im; |
| assertEqual(&c, &d); |
| } |
| |
| /*************************************/ |
| |
| ireal x35; |
| |
| void foo35() |
| { |
| x35 = -x35; |
| } |
| |
| void bar35() |
| { |
| return foo35(); |
| } |
| |
| void test35() |
| { |
| x35=2i; |
| bar35(); |
| assert(x35==-2i); |
| } |
| |
| /*************************************/ |
| |
| void test36() |
| { |
| ireal imag = 2.5i; |
| printf ("test of imag*imag = %Lf\n",imag*imag); |
| assert(imag * imag == -6.25); |
| } |
| |
| /*************************************/ |
| |
| void test37() |
| { |
| creal z1 = 1. - 2.0i; |
| ireal imag_part = z1.im/1i; |
| } |
| |
| /***********************************/ |
| |
| void test38() |
| { |
| ireal imag = 2.5i; |
| //printf ("test of imag*imag = %Lf\n",imag*imag); |
| real f = imag * imag; |
| assert(f == -6.25); |
| } |
| |
| /***********************************/ |
| |
| void test39() |
| { |
| creal z = 1 + 2.5i; |
| real e = z.im; |
| |
| printf ("e = %Lf\n", e); |
| assert(e == 2.5); |
| } |
| |
| /***********************************/ |
| |
| void test40() |
| { |
| ifloat b = cast(ifloat)1i; |
| assert(b == 1.0i); |
| |
| ifloat c = 2fi; |
| assert(c == 2.0i); |
| |
| c = 0fi; |
| assert(c == 0i); |
| } |
| |
| /***************************************************/ |
| |
| void test41() |
| { |
| creal a=1.3L+9.7Li; |
| assert(a.re == 1.3L); |
| assert(a.im == 9.7L); |
| } |
| |
| /***************************************************/ |
| |
| void test42() |
| { |
| creal c = 2.7L + 0i; |
| assert(c.re==2.7L); |
| assert(c.im==0.0L); |
| } |
| |
| /***********************************/ |
| |
| void test43() |
| { |
| creal C,Cj; |
| real y1,x1; |
| |
| C = x1 + y1*1i + Cj; |
| C = 1i*y1 + x1 + Cj; |
| C = Cj + 1i*y1 + x1; |
| C = y1*1i + Cj + x1; |
| C = 1i*y1 + Cj; |
| C = Cj + 1i*y1; |
| } |
| |
| /***************************************************/ |
| |
| void test44() |
| { |
| ifloat f = 1.0fi; |
| // f *= 2.0fi; // illegal but compiles |
| printf("%g\n", f); |
| // assert(f == 0i); |
| } |
| |
| /******************************************************/ |
| |
| void test45() |
| { |
| TypeInfo ti; |
| |
| ti = typeid(ifloat[]); |
| assert(!(ti is null)); |
| ti = typeid(idouble[]); |
| assert(!(ti is null)); |
| ti = typeid(ireal[]); |
| assert(!(ti is null)); |
| |
| ti = typeid(cfloat[]); |
| assert(!(ti is null)); |
| ti = typeid(cdouble[]); |
| assert(!(ti is null)); |
| ti = typeid(creal[]); |
| assert(!(ti is null)); |
| } |
| |
| /******************************************************/ |
| |
| void test46() |
| { |
| TypeInfo ti = typeid(ifloat*); |
| assert(!(ti is null)); |
| assert(ti.tsize==(ifloat*).sizeof); |
| assert(ti.toString()=="ifloat*"); |
| } |
| |
| /******************************************************/ |
| |
| void test47() |
| { |
| TypeInfo ti = typeid(cfloat*); |
| assert(!(ti is null)); |
| assert(ti.tsize==(cfloat*).sizeof); |
| assert(ti.toString()=="cfloat*"); |
| } |
| |
| /******************************************************/ |
| |
| void test48() |
| { |
| TypeInfo ti = typeid(idouble*); |
| assert(!(ti is null)); |
| assert(ti.tsize==(idouble*).sizeof); |
| assert(ti.toString()=="idouble*"); |
| } |
| |
| /******************************************************/ |
| |
| void test49() |
| { |
| TypeInfo ti = typeid(cdouble*); |
| assert(!(ti is null)); |
| assert(ti.tsize==(cdouble*).sizeof); |
| assert(ti.toString()=="cdouble*"); |
| } |
| |
| /***********************************/ |
| |
| void foo51(creal a) |
| { |
| assert(a == -8i); |
| } |
| |
| void test51() |
| { |
| assert((2-2i)*(2-2i) == -8i); |
| |
| cdouble a = (2-2i)*(2-2i); |
| assert(a == -8i); |
| |
| foo51((2-2i)*(2-2i)); |
| } |
| |
| /******************************************************/ |
| |
| void test52() |
| { |
| TypeInfo ti = typeid(ireal*); |
| assert(!(ti is null)); |
| assert(ti.tsize==(ireal*).sizeof); |
| assert(ti.toString()=="ireal*"); |
| } |
| |
| /******************************************************/ |
| |
| void test53() |
| { |
| TypeInfo ti = typeid(creal*); |
| assert(!(ti is null)); |
| assert(ti.tsize==(creal*).sizeof); |
| assert(ti.toString()=="creal*"); |
| } |
| |
| /*******************************************/ |
| |
| auto init(T)(T val) { return 1; } |
| |
| void test54() |
| { |
| // See built-in 'init' property |
| assert(10i .init is idouble.nan); |
| |
| // x.init() has parens, so it runs UFCS call |
| assert(10i .init() == 1); |
| |
| // x.init!YYY matches templatized UFCS call. |
| assert(10i .init!idouble() == 1); |
| } |
| |
| /*******************************************/ |
| |
| creal x55; |
| |
| void foo55() |
| { |
| x55 = -x55; |
| } |
| |
| void bar55() |
| { |
| return foo55(); |
| } |
| |
| void test55() |
| { |
| x55 = 2.0L + 0.0Li; |
| bar55(); |
| assert(x55 == -2.0L + 0.0Li); |
| } |
| |
| /***************************************************/ |
| |
| template Q(s...) { alias s q; } |
| |
| void test56() |
| { |
| enum complex80 = Q!( 1+1.0i ).q.stringof; |
| } |
| |
| /********************************************************/ |
| |
| void test57() |
| { |
| assert(__traits(isArithmetic, ifloat) == true); |
| assert(__traits(isArithmetic, idouble) == true); |
| assert(__traits(isArithmetic, ireal) == true); |
| assert(__traits(isArithmetic, cfloat) == true); |
| assert(__traits(isArithmetic, cdouble) == true); |
| assert(__traits(isArithmetic, creal) == true); |
| |
| assert(__traits(isScalar, ifloat) == true); |
| assert(__traits(isScalar, idouble) == true); |
| assert(__traits(isScalar, ireal) == true); |
| assert(__traits(isScalar, cfloat) == true); |
| assert(__traits(isScalar, cdouble) == true); |
| assert(__traits(isScalar, creal) == true); |
| |
| assert(__traits(isFloating, ifloat) == true); |
| assert(__traits(isFloating, idouble) == true); |
| assert(__traits(isFloating, ireal) == true); |
| assert(__traits(isFloating, cfloat) == true); |
| assert(__traits(isFloating, cdouble) == true); |
| assert(__traits(isFloating, creal) == true); |
| |
| assert(__traits(isIntegral, ifloat) == false); |
| assert(__traits(isIntegral, idouble) == false); |
| assert(__traits(isIntegral, ireal) == false); |
| assert(__traits(isIntegral, cfloat) == false); |
| assert(__traits(isIntegral, cdouble) == false); |
| assert(__traits(isIntegral, creal) == false); |
| |
| assert(__traits(isUnsigned, ifloat) == false); |
| assert(__traits(isUnsigned, idouble) == false); |
| assert(__traits(isUnsigned, ireal) == false); |
| assert(__traits(isUnsigned, cfloat) == false); |
| assert(__traits(isUnsigned, cdouble) == false); |
| assert(__traits(isUnsigned, creal) == false); |
| |
| assert(__traits(isAssociativeArray, ifloat) == false); |
| assert(__traits(isAssociativeArray, idouble) == false); |
| assert(__traits(isAssociativeArray, ireal) == false); |
| assert(__traits(isAssociativeArray, cfloat) == false); |
| assert(__traits(isAssociativeArray, cdouble) == false); |
| assert(__traits(isAssociativeArray, creal) == false); |
| |
| assert(__traits(isStaticArray, ifloat) == false); |
| assert(__traits(isStaticArray, idouble) == false); |
| assert(__traits(isStaticArray, ireal) == false); |
| assert(__traits(isStaticArray, cfloat) == false); |
| assert(__traits(isStaticArray, cdouble) == false); |
| assert(__traits(isStaticArray, creal) == false); |
| |
| assert(__traits(isAbstractClass, ifloat) == false); |
| assert(__traits(isAbstractClass, idouble) == false); |
| assert(__traits(isAbstractClass, ireal) == false); |
| assert(__traits(isAbstractClass, cfloat) == false); |
| assert(__traits(isAbstractClass, cdouble) == false); |
| assert(__traits(isAbstractClass, creal) == false); |
| } |
| |
| /*******************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=3382 |
| |
| real toreal(ireal x){ return x.im; } |
| |
| void test3382() |
| { |
| assert(1.4i.toreal() == 1.4); |
| } |
| |
| /***************************************************/ |
| |
| alias ireal BUG3919; |
| alias typeof(BUG3919.init*BUG3919.init) ICE3919; |
| alias typeof(BUG3919.init/BUG3919.init) ICE3920; |
| |
| /***************************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=8454 |
| |
| double sqrt8454(double d) { return d/2; } |
| void foo8454(cdouble m) {} |
| |
| void test8454() |
| { |
| foo8454(0 - sqrt8454(1.0) * 1i); |
| } |
| |
| /************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=9046 |
| |
| void test9046() |
| { |
| foreach (T; AliasSeq!(ifloat, idouble, ireal, cfloat, cdouble, creal)) |
| foreach (U; AliasSeq!(T, const T, immutable T, shared T, shared const T, inout T, shared inout T)) |
| { |
| static assert(is(typeof(U.init) == U)); |
| } |
| } |
| |
| /********************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=9112 |
| |
| void test9112a() // T() and T(v) |
| { |
| void test(T)(T v) |
| { |
| foreach (string qual; AliasSeq!("", "const ", "immutable ")) |
| { |
| mixin("alias U = "~qual~T.stringof~";"); |
| //pragma(msg, U); |
| |
| mixin("auto x1 = "~qual~T.stringof~"();"); // U() default construction syntax |
| mixin("auto x2 = "~qual~T.stringof~"(v);"); // U(v) |
| static assert(!__traits(compiles, mixin(qual~T.stringof~"(v, v)"))); // U(v, v) |
| static assert(is(typeof(x1) == U)); |
| static assert(is(typeof(x2) == U)); |
| static if ( is(typeof(U.nan) : real)) assert( isnan(x1.re) && !isnan(x1.im), U.stringof); |
| static if ( is(typeof(U.nan) : ireal)) assert(!isnan(x1.re) && isnan(x1.im), U.stringof); |
| static if ( is(typeof(U.nan) : creal)) assert( isnan(x1.re) && isnan(x1.im), U.stringof); |
| static if (!is(typeof(U.nan))) assert( x1 == U.init, U.stringof); |
| assert(x2 == v, U.stringof); |
| } |
| } |
| test!(ifloat )(1.4142i); |
| test!(idouble)(1.4142i); |
| test!(ireal )(1.4142i); |
| test!(cfloat )(1.2+3.4i); |
| test!(cdouble)(1.2+3.4i); |
| test!(creal )(1.2+3.4i); |
| |
| static assert(!__traits(compiles, double(3.14i))); |
| } |
| |
| void test9112b() // new T(v) |
| { |
| void test(T)(T v) |
| { |
| foreach (string qual; AliasSeq!("", "const ", "immutable ")) |
| { |
| mixin("alias U = "~qual~T.stringof~";"); |
| //pragma(msg, U); |
| |
| mixin("auto p1 = new "~qual~T.stringof~"();"); // U() default construction syntax |
| mixin("auto p2 = new "~qual~T.stringof~"(v);"); // U(v) |
| static assert(!__traits(compiles, mixin("new "~qual~T.stringof~"(v, v)"))); // U(v, v) |
| static assert(is(typeof(p1) == U*)); |
| static assert(is(typeof(p2) == U*)); |
| assert( p1 !is null); |
| assert( p2 !is null); |
| auto x1 = *p1; |
| auto x2 = *p2; |
| static if ( is(typeof(U.nan) : real)) assert( isnan(x1.re) && !isnan(x1.im), U.stringof); |
| static if ( is(typeof(U.nan) : ireal)) assert(!isnan(x1.re) && isnan(x1.im), U.stringof); |
| static if ( is(typeof(U.nan) : creal)) assert( isnan(x1.re) && isnan(x1.im), U.stringof); |
| static if (!is(typeof(U.nan))) assert( x1 == U.init, U.stringof); |
| assert(x2 == v, U.stringof); |
| } |
| } |
| |
| test!(ifloat )(1.4142i); |
| test!(idouble)(1.4142i); |
| test!(ireal )(1.4142i); |
| test!(cfloat )(1.2+3.4i); |
| test!(cdouble)(1.2+3.4i); |
| test!(creal )(1.2+3.4i); |
| |
| static assert(!__traits(compiles, new double(3.14i))); |
| } |
| |
| /***************************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=10639 |
| |
| struct S1 |
| { |
| cdouble val; |
| } |
| |
| void formatTest(S1 s, double re, double im) |
| { |
| assert(s.val.re == re); |
| assert(s.val.im == im); |
| } |
| |
| void test10639() |
| { |
| S1 s = S1(3+2.25i); |
| formatTest(s, 3, 2.25); |
| } |
| |
| /***************************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=10842 |
| |
| template Test10842(F, T) |
| { |
| bool res; |
| F from() |
| { |
| res = true; |
| return F.init; |
| } |
| T to() |
| { |
| // The cast operand had incorrectly been eliminated |
| return cast(T)from(); |
| } |
| bool test() |
| { |
| res = false; |
| to(); |
| return res; |
| } |
| } |
| |
| void test10842() |
| { |
| foreach (From; AliasSeq!(bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double, real)) |
| { |
| foreach (To; AliasSeq!(ifloat, idouble, ireal)) |
| { |
| if (!Test10842!(From, To).test()) |
| assert(0); |
| } |
| } |
| |
| foreach (From; AliasSeq!(ifloat, idouble, ireal)) |
| { |
| foreach (To; AliasSeq!(/*bool*, */byte, ubyte, short, ushort, int, uint, long, ulong, float, double, real)) |
| { |
| if (!Test10842!(From, To).test()) |
| assert(0); |
| } |
| } |
| } |
| |
| /***************************************************/ |
| |
| void test10927() |
| { |
| static assert( (1+2i) ^^ 3 == -11 - 2i ); |
| auto a = (1+2i) ^^ 3; |
| } |
| |
| /******************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=13252 |
| |
| alias TypeTuple13252(T...) = T; |
| |
| static assert(is(typeof(TypeTuple13252!(cast(cfloat )(1 + 2i))[0]) == cfloat )); |
| static assert(is(typeof(TypeTuple13252!(cast(cdouble)(1 + 2i))[0]) == cdouble)); |
| |
| /***************************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=14218 |
| |
| void test14218() |
| { |
| version (DigitalMars) |
| { |
| // Questionable but currently accepted by DMD (but not GDC). |
| foreach (To; AliasSeq!(ifloat, idouble, ireal)) |
| { |
| auto x = cast(To)null; |
| assert(x == 0); // 0i |
| } |
| |
| // Internal error: backend/el.c in el_long() |
| //foreach (To; AliasSeq!(cfloat, cdouble, creal)) |
| //{ |
| // static assert(!__traits(compiles, { auto x = cast(To)null; })); |
| //} |
| } |
| } |
| |
| /******************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=15653 |
| |
| alias TypeTuple15653(T...) = T; |
| |
| void test15653() |
| { |
| void foo(U, T)(const T x) { static assert(is(T == U)); } |
| void bar(U, T)(immutable T x) { static assert(is(T == U)); } |
| |
| struct X { int a; long[2] b; } |
| struct Y { int* a; long[] b; } |
| |
| foreach (U; TypeTuple15653!( |
| ifloat, idouble, ireal, |
| cfloat, cdouble, creal)) |
| { |
| foo!U(U.init); // OK |
| bar!U(U.init); // Was error, now OK |
| |
| U u; |
| foo!U(u); // OK |
| bar!U(u); // Was error, now OK |
| } |
| } |
| |
| /***************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=17087 |
| |
| cfloat toComplex(int x) { return cast(cfloat)x; } |
| |
| void test17087() |
| { |
| assert (toComplex(1) == 1.0); |
| } |
| |
| /***************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=17677 |
| |
| void test17677() |
| { |
| cfloat v2 = 0.0f + 0.0fi; |
| ulong v1 = 1; |
| auto z = v2 + v1; |
| assert(z == 1.0f); |
| } |
| |
| /***************************************/ |
| // https://issues.dlang.org/show_bug.cgi?id=17677 |
| |
| float getreal_rcx(cfloat z) |
| { |
| return z.re; |
| } |
| float getimag_rcx(cfloat z) |
| { |
| return z.im; |
| } |
| |
| float getreal_rdx(cfloat z, int) |
| { |
| return z.re; |
| } |
| float getimag_rdx(cfloat z, int) |
| { |
| return z.im; |
| } |
| |
| float getreal_r8(cfloat z, int, int) |
| { |
| return z.re; |
| } |
| float getimag_r8(cfloat z, int, int) |
| { |
| return z.im; |
| } |
| |
| float getreal_r9(cfloat z, int, int, int) |
| { |
| return z.re; |
| } |
| float getimag_r9(cfloat z, int, int, int) |
| { |
| return z.im; |
| } |
| |
| float getreal_stack(cfloat z, int, int, int, int) |
| { |
| return z.re; |
| } |
| float getimag_stack(cfloat z, int, int, int, int) |
| { |
| return z.im; |
| } |
| |
| void test18772a() |
| { |
| cfloat[1] A; |
| float[1] B; |
| int i = 0; |
| A[0] = 2.0f + 4i; |
| B[0] = 3.0f; |
| assert(6.0 == getreal_rcx(A[i] * B[i])); |
| assert(12.0 == getimag_rcx(A[i] * B[i])); |
| |
| assert(6.0 == getreal_rdx(A[i] * B[i], 1)); |
| assert(12.0 == getimag_rdx(A[i] * B[i], 1)); |
| |
| assert(6.0 == getreal_r8(A[i] * B[i], 1, 2)); |
| assert(12.0 == getimag_r8(A[i] * B[i], 1, 2)); |
| |
| assert(6.0 == getreal_r9(A[i] * B[i], 1, 2, 3)); |
| assert(12.0 == getimag_r9(A[i] * B[i], 1, 2, 3)); |
| |
| assert(6.0 == getreal_stack(A[i] * B[i], 1, 2, 3, 4)); |
| assert(12.0 == getimag_stack(A[i] * B[i], 1, 2, 3, 4)); |
| } |
| |
| void test18772b(T)() |
| { |
| static auto getre0(T z) |
| { |
| return z.re; |
| } |
| static auto getim0(T z) |
| { |
| return z.im; |
| } |
| |
| T z = 3 + 4i; |
| auto d = z.re; |
| |
| assert(getre0(d * z) == d * 3); |
| assert(getim0(d * z) == d * 4); |
| } |
| |
| void test18772() |
| { |
| test18772a(); |
| |
| test18772b!cfloat(); |
| test18772b!cdouble(); |
| test18772b!creal(); |
| } |
| |
| /***************************************/ |
| |
| int main(char[][] args) |
| { |
| |
| test2(); |
| test3(); |
| test4(); |
| test5(); |
| test6(); |
| test7(); |
| test8(); |
| test9(); |
| test10(); |
| test11(); |
| test12(); |
| test13(); |
| test14(); |
| test7581(); |
| test7594(); |
| test7593(); |
| test7591(); |
| test8966(); |
| test10677(); |
| test7806(); |
| test7976(); |
| test15(); |
| test16(); |
| test17(); |
| test18(); |
| test19(); |
| test20(); |
| test21(); |
| test22(); |
| test23(); |
| test24(); |
| test25(); |
| test26(); |
| test27(); |
| test28(); |
| test29(); |
| test30(); |
| test31(); |
| test32(); |
| test33(); |
| test34(); |
| test35(); |
| test36(); |
| test37(); |
| test38(); |
| test39(); |
| test40(); |
| test41(); |
| test42(); |
| test43(); |
| test44(); |
| test45(); |
| test46(); |
| test47(); |
| test48(); |
| test49(); |
| test51(); |
| test52(); |
| test53(); |
| test54(); |
| test55(); |
| test56(); |
| test57(); |
| test8454(); |
| test9046(); |
| test9112a(); |
| test9112b(); |
| test10639(); |
| test10842(); |
| test14218(); |
| test15653(); |
| test17087(); |
| test17677(); |
| test18772(); |
| |
| printf("Success!\n"); |
| return 0; |
| } |