fix pow aliasing issue and add test code

This commit is contained in:
Fredrik Johansson 2013-08-02 21:06:10 +02:00
parent afcb73bc78
commit 06592241a1
4 changed files with 56 additions and 2 deletions

View file

@ -158,8 +158,8 @@ fmpcb_pow_fmprb(fmpcb_t z, const fmpcb_t x, const fmprb_t y, long prec)
if (*exp_exp == -1L)
{
fmpcb_sqrt(z, x, prec + exp_bits);
fmpz_set(e, fmpr_manref(fmprb_midref(y)));
fmpcb_sqrt(z, x, prec + exp_bits);
fmpcb_pow_fmpz(z, z, e, prec);
}
else

View file

@ -88,6 +88,33 @@ int main()
abort();
}
fmpcb_pow(c, a, b, prec1);
fmpcb_set(d, a);
fmpcb_pow(d, d, b, prec2);
if (!fmpcb_overlaps(c, d))
{
printf("FAIL: aliasing 1\n\n");
printf("a = "); fmpcb_print(a); printf("\n\n");
printf("b = "); fmpcb_print(b); printf("\n\n");
printf("c = "); fmpcb_print(c); printf("\n\n");
printf("d = "); fmpcb_print(d); printf("\n\n");
abort();
}
fmpcb_set(d, b);
fmpcb_pow(d, a, d, prec2);
if (!fmpcb_overlaps(c, d))
{
printf("FAIL: aliasing 2\n\n");
printf("a = "); fmpcb_print(a); printf("\n\n");
printf("b = "); fmpcb_print(b); printf("\n\n");
printf("c = "); fmpcb_print(c); printf("\n\n");
printf("d = "); fmpcb_print(d); printf("\n\n");
abort();
}
fmpcb_clear(a);
fmpcb_clear(b);
fmpcb_clear(c);

View file

@ -65,8 +65,8 @@ fmprb_pow(fmprb_t z, const fmprb_t x, const fmprb_t y, long prec)
if (*exp_exp == -1L)
{
fmprb_sqrt(z, x, prec + exp_bits);
fmpz_set(e, fmpr_manref(fmprb_midref(y)));
fmprb_sqrt(z, x, prec + exp_bits);
fmprb_pow_fmpz_binexp(z, z, e, prec);
}
else

View file

@ -88,6 +88,33 @@ int main()
abort();
}
fmprb_pow(c, a, b, prec1);
fmprb_set(d, a);
fmprb_pow(d, d, b, prec2);
if (!fmprb_overlaps(c, d))
{
printf("FAIL: aliasing 1\n\n");
printf("a = "); fmprb_print(a); printf("\n\n");
printf("b = "); fmprb_print(b); printf("\n\n");
printf("c = "); fmprb_print(c); printf("\n\n");
printf("d = "); fmprb_print(d); printf("\n\n");
abort();
}
fmprb_set(d, b);
fmprb_pow(d, a, d, prec2);
if (!fmprb_overlaps(c, d))
{
printf("FAIL: aliasing 2\n\n");
printf("a = "); fmprb_print(a); printf("\n\n");
printf("b = "); fmprb_print(b); printf("\n\n");
printf("c = "); fmprb_print(c); printf("\n\n");
printf("d = "); fmprb_print(d); printf("\n\n");
abort();
}
fmprb_clear(a);
fmprb_clear(b);
fmprb_clear(c);