mirror of
https://github.com/vale981/arb
synced 2025-03-06 09:51:39 -05:00
fix pow aliasing issue and add test code
This commit is contained in:
parent
afcb73bc78
commit
06592241a1
4 changed files with 56 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue