mirror of
https://github.com/vale981/arb
synced 2025-03-04 17:01:40 -05:00
Optimization: LAGOM is finite. Add test.
This commit is contained in:
parent
89b489e64d
commit
a9f8822361
5 changed files with 365 additions and 82 deletions
42
arb/addmul.c
42
arb/addmul.c
|
@ -24,13 +24,6 @@ arb_addmul_arf(arb_t z, const arb_t x, const arf_t y, slong prec)
|
|||
if (inexact)
|
||||
arf_mag_add_ulp(arb_radref(z), arb_radref(z), arb_midref(z), prec);
|
||||
}
|
||||
else if (arf_is_inf(y) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_add_arf(z, z, y, prec);
|
||||
else
|
||||
arb_sub_arf(z, z, y, prec);
|
||||
}
|
||||
else if (ARB_IS_LAGOM(x) && ARF_IS_LAGOM(y) && ARB_IS_LAGOM(z))
|
||||
{
|
||||
mag_fast_init_set_arf(ym, y);
|
||||
|
@ -40,6 +33,13 @@ arb_addmul_arf(arb_t z, const arb_t x, const arf_t y, slong prec)
|
|||
if (inexact)
|
||||
arf_mag_fast_add_ulp(arb_radref(z), arb_radref(z), arb_midref(z), prec);
|
||||
}
|
||||
else if (arf_is_inf(y) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_add_arf(z, z, y, prec);
|
||||
else
|
||||
arb_sub_arf(z, z, y, prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
mag_init_set_arf(ym, y);
|
||||
|
@ -67,20 +67,6 @@ arb_addmul(arb_t z, const arb_t x, const arb_t y, slong prec)
|
|||
{
|
||||
arb_addmul_arf(z, y, arb_midref(x), prec);
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(x)) && mag_is_finite(arb_radref(x)) && arb_is_nonzero(y))
|
||||
{
|
||||
if (arf_sgn(arb_midref(y)) > 0)
|
||||
arb_add_arf(z, z, arb_midref(x), prec);
|
||||
else
|
||||
arb_sub_arf(z, z, arb_midref(x), prec);
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(y)) && mag_is_finite(arb_radref(y)) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_add_arf(z, z, arb_midref(y), prec);
|
||||
else
|
||||
arb_sub_arf(z, z, arb_midref(y), prec);
|
||||
}
|
||||
else if (ARB_IS_LAGOM(x) && ARB_IS_LAGOM(y) && ARB_IS_LAGOM(z))
|
||||
{
|
||||
mag_fast_init_set_arf(xm, arb_midref(x));
|
||||
|
@ -99,6 +85,20 @@ arb_addmul(arb_t z, const arb_t x, const arb_t y, slong prec)
|
|||
|
||||
*arb_radref(z) = *zr;
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(x)) && mag_is_finite(arb_radref(x)) && arb_is_nonzero(y))
|
||||
{
|
||||
if (arf_sgn(arb_midref(y)) > 0)
|
||||
arb_add_arf(z, z, arb_midref(x), prec);
|
||||
else
|
||||
arb_sub_arf(z, z, arb_midref(x), prec);
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(y)) && mag_is_finite(arb_radref(y)) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_add_arf(z, z, arb_midref(y), prec);
|
||||
else
|
||||
arb_sub_arf(z, z, arb_midref(y), prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
mag_init_set_arf(xm, arb_midref(x));
|
||||
|
|
42
arb/fma.c
42
arb/fma.c
|
@ -26,13 +26,6 @@ arb_fma_arf(arb_t res, const arb_t x, const arf_t y, const arb_t z, slong prec)
|
|||
else
|
||||
mag_set(arb_radref(res), arb_radref(z));
|
||||
}
|
||||
else if (arf_is_inf(y) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_add_arf(res, z, y, prec);
|
||||
else
|
||||
arb_sub_arf(res, z, y, prec);
|
||||
}
|
||||
else if (ARB_IS_LAGOM(res) && ARB_IS_LAGOM(x) && ARF_IS_LAGOM(y) && ARB_IS_LAGOM(z))
|
||||
{
|
||||
mag_t tm;
|
||||
|
@ -46,6 +39,13 @@ arb_fma_arf(arb_t res, const arb_t x, const arf_t y, const arb_t z, slong prec)
|
|||
if (inexact)
|
||||
arf_mag_fast_add_ulp(arb_radref(res), arb_radref(res), arb_midref(res), prec);
|
||||
}
|
||||
else if (arf_is_inf(y) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_add_arf(res, z, y, prec);
|
||||
else
|
||||
arb_sub_arf(res, z, y, prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
mag_t tm;
|
||||
|
@ -80,20 +80,6 @@ arb_fma(arb_t res, const arb_t x, const arb_t y, const arb_t z, slong prec)
|
|||
{
|
||||
arb_fma_arf(res, y, arb_midref(x), z, prec);
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(x)) && mag_is_finite(arb_radref(x)) && arb_is_nonzero(y))
|
||||
{
|
||||
if (arf_sgn(arb_midref(y)) > 0)
|
||||
arb_add_arf(res, z, arb_midref(x), prec);
|
||||
else
|
||||
arb_sub_arf(res, z, arb_midref(x), prec);
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(y)) && mag_is_finite(arb_radref(y)) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_add_arf(res, z, arb_midref(y), prec);
|
||||
else
|
||||
arb_sub_arf(res, z, arb_midref(y), prec);
|
||||
}
|
||||
else if (ARB_IS_LAGOM(res) && ARB_IS_LAGOM(x) && ARB_IS_LAGOM(y) && ARB_IS_LAGOM(z))
|
||||
{
|
||||
mag_fast_init_set_arf(xm, arb_midref(x));
|
||||
|
@ -112,6 +98,20 @@ arb_fma(arb_t res, const arb_t x, const arb_t y, const arb_t z, slong prec)
|
|||
|
||||
*arb_radref(res) = *zr;
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(x)) && mag_is_finite(arb_radref(x)) && arb_is_nonzero(y))
|
||||
{
|
||||
if (arf_sgn(arb_midref(y)) > 0)
|
||||
arb_add_arf(res, z, arb_midref(x), prec);
|
||||
else
|
||||
arb_sub_arf(res, z, arb_midref(x), prec);
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(y)) && mag_is_finite(arb_radref(y)) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_add_arf(res, z, arb_midref(y), prec);
|
||||
else
|
||||
arb_sub_arf(res, z, arb_midref(y), prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
mag_init_set_arf(xm, arb_midref(x));
|
||||
|
|
38
arb/mul.c
38
arb/mul.c
|
@ -26,15 +26,6 @@ arb_mul_arf(arb_t z, const arb_t x, const arf_t y, slong prec)
|
|||
else
|
||||
mag_zero(arb_radref(z));
|
||||
}
|
||||
else if (arf_is_inf(y) && arb_is_nonzero(x))
|
||||
{
|
||||
mag_zero(arb_radref(z));
|
||||
|
||||
if (arf_sgn(arb_midref(x)) * arf_sgn(y) > 0)
|
||||
arf_pos_inf(arb_midref(z));
|
||||
else
|
||||
arf_neg_inf(arb_midref(z));
|
||||
}
|
||||
else if (ARB_IS_LAGOM(x) && ARF_IS_LAGOM(y) && ARB_IS_LAGOM(z))
|
||||
{
|
||||
mag_fast_init_set_arf(ym, y);
|
||||
|
@ -49,6 +40,15 @@ arb_mul_arf(arb_t z, const arb_t x, const arf_t y, slong prec)
|
|||
|
||||
*arb_radref(z) = *zr;
|
||||
}
|
||||
else if (arf_is_inf(y) && arb_is_nonzero(x))
|
||||
{
|
||||
mag_zero(arb_radref(z));
|
||||
|
||||
if (arf_sgn(arb_midref(x)) * arf_sgn(y) > 0)
|
||||
arf_pos_inf(arb_midref(z));
|
||||
else
|
||||
arf_neg_inf(arb_midref(z));
|
||||
}
|
||||
else
|
||||
{
|
||||
mag_init_set_arf(ym, y);
|
||||
|
@ -83,16 +83,6 @@ arb_mul(arb_t z, const arb_t x, const arb_t y, slong prec)
|
|||
{
|
||||
arb_mul_arf(z, x, arb_midref(y), prec);
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(x)) && mag_is_finite(arb_radref(x)) && arb_is_nonzero(y) ||
|
||||
arf_is_inf(arb_midref(y)) && mag_is_finite(arb_radref(y)) && arb_is_nonzero(x))
|
||||
{
|
||||
mag_zero(arb_radref(z));
|
||||
|
||||
if (arf_sgn(arb_midref(x)) * arf_sgn(arb_midref(y)) > 0)
|
||||
arf_pos_inf(arb_midref(z));
|
||||
else
|
||||
arf_neg_inf(arb_midref(z));
|
||||
}
|
||||
else if (ARB_IS_LAGOM(x) && ARB_IS_LAGOM(y) && ARB_IS_LAGOM(z))
|
||||
{
|
||||
mag_fast_init_set_arf(xm, arb_midref(x));
|
||||
|
@ -110,6 +100,16 @@ arb_mul(arb_t z, const arb_t x, const arb_t y, slong prec)
|
|||
|
||||
*arb_radref(z) = *zr;
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(x)) && mag_is_finite(arb_radref(x)) && arb_is_nonzero(y) ||
|
||||
arf_is_inf(arb_midref(y)) && mag_is_finite(arb_radref(y)) && arb_is_nonzero(x))
|
||||
{
|
||||
mag_zero(arb_radref(z));
|
||||
|
||||
if (arf_sgn(arb_midref(x)) * arf_sgn(arb_midref(y)) > 0)
|
||||
arf_pos_inf(arb_midref(z));
|
||||
else
|
||||
arf_neg_inf(arb_midref(z));
|
||||
}
|
||||
else
|
||||
{
|
||||
mag_init_set_arf(xm, arb_midref(x));
|
||||
|
|
42
arb/submul.c
42
arb/submul.c
|
@ -24,13 +24,6 @@ arb_submul_arf(arb_t z, const arb_t x, const arf_t y, slong prec)
|
|||
if (inexact)
|
||||
arf_mag_add_ulp(arb_radref(z), arb_radref(z), arb_midref(z), prec);
|
||||
}
|
||||
else if (arf_is_inf(y) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_sub_arf(z, z, y, prec);
|
||||
else
|
||||
arb_add_arf(z, z, y, prec);
|
||||
}
|
||||
else if (ARB_IS_LAGOM(x) && ARF_IS_LAGOM(y) && ARB_IS_LAGOM(z))
|
||||
{
|
||||
mag_fast_init_set_arf(ym, y);
|
||||
|
@ -40,6 +33,13 @@ arb_submul_arf(arb_t z, const arb_t x, const arf_t y, slong prec)
|
|||
if (inexact)
|
||||
arf_mag_fast_add_ulp(arb_radref(z), arb_radref(z), arb_midref(z), prec);
|
||||
}
|
||||
else if (arf_is_inf(y) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_sub_arf(z, z, y, prec);
|
||||
else
|
||||
arb_add_arf(z, z, y, prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
mag_init_set_arf(ym, y);
|
||||
|
@ -67,20 +67,6 @@ arb_submul(arb_t z, const arb_t x, const arb_t y, slong prec)
|
|||
{
|
||||
arb_submul_arf(z, y, arb_midref(x), prec);
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(x)) && mag_is_finite(arb_radref(x)) && arb_is_nonzero(y))
|
||||
{
|
||||
if (arf_sgn(arb_midref(y)) > 0)
|
||||
arb_sub_arf(z, z, arb_midref(x), prec);
|
||||
else
|
||||
arb_add_arf(z, z, arb_midref(x), prec);
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(y)) && mag_is_finite(arb_radref(y)) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_sub_arf(z, z, arb_midref(y), prec);
|
||||
else
|
||||
arb_add_arf(z, z, arb_midref(y), prec);
|
||||
}
|
||||
else if (ARB_IS_LAGOM(x) && ARB_IS_LAGOM(y) && ARB_IS_LAGOM(z))
|
||||
{
|
||||
mag_fast_init_set_arf(xm, arb_midref(x));
|
||||
|
@ -99,6 +85,20 @@ arb_submul(arb_t z, const arb_t x, const arb_t y, slong prec)
|
|||
|
||||
*arb_radref(z) = *zr;
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(x)) && mag_is_finite(arb_radref(x)) && arb_is_nonzero(y))
|
||||
{
|
||||
if (arf_sgn(arb_midref(y)) > 0)
|
||||
arb_sub_arf(z, z, arb_midref(x), prec);
|
||||
else
|
||||
arb_add_arf(z, z, arb_midref(x), prec);
|
||||
}
|
||||
else if (arf_is_inf(arb_midref(y)) && mag_is_finite(arb_radref(y)) && arb_is_nonzero(x))
|
||||
{
|
||||
if (arf_sgn(arb_midref(x)) > 0)
|
||||
arb_sub_arf(z, z, arb_midref(y), prec);
|
||||
else
|
||||
arb_add_arf(z, z, arb_midref(y), prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
mag_init_set_arf(xm, arb_midref(x));
|
||||
|
|
283
arb/test/t-pos_times_posinf.c
Normal file
283
arb/test/t-pos_times_posinf.c
Normal file
|
@ -0,0 +1,283 @@
|
|||
#include <math.h>
|
||||
#include "arb.h"
|
||||
|
||||
#define PRINT_PRECISION 20
|
||||
|
||||
typedef enum {
|
||||
ALL_POSITIVE = 0,
|
||||
CONTAINS_ZERO = 1,
|
||||
ALL_NEGATIVE = 2,
|
||||
ANY_FINITE = 3, /* used only to represent either of the previous three */
|
||||
POSITIVE_INFINITY = 4,
|
||||
NEGATIVE_INFINITY = 5,
|
||||
WHOLE_LINE = 6,
|
||||
ANY_INFINITE = 7, /* used only to represent either of the previous three */
|
||||
NOT_A_NUMBER = 8,
|
||||
NUM_VALUE_TYPES = 9 /* used only to count the number of enum values */
|
||||
} value_type;
|
||||
|
||||
typedef struct {
|
||||
const char *value;
|
||||
value_type type;
|
||||
} string_with_type;
|
||||
|
||||
const string_with_type test_values_arb[] = {
|
||||
{"5.3 +/- 1.2", ALL_POSITIVE},
|
||||
{"1.2 +/- 5.3", CONTAINS_ZERO},
|
||||
{"-1.2 +/- 5.3", CONTAINS_ZERO},
|
||||
{"-5.3 +/- 1.2", ALL_NEGATIVE},
|
||||
{"inf +/- 17", POSITIVE_INFINITY},
|
||||
{"-inf +/- 17", NEGATIVE_INFINITY},
|
||||
{"17 +/- inf", WHOLE_LINE},
|
||||
{"-inf +/- inf", WHOLE_LINE},
|
||||
{"nan +/- 17", NOT_A_NUMBER},
|
||||
{"nan +/- inf", NOT_A_NUMBER},
|
||||
{NULL, NOT_A_NUMBER},
|
||||
};
|
||||
|
||||
const string_with_type test_values_arf[] = {
|
||||
{"5.3", ALL_POSITIVE},
|
||||
{"0", CONTAINS_ZERO},
|
||||
{"-5.3", ALL_NEGATIVE},
|
||||
{"inf", POSITIVE_INFINITY},
|
||||
{"-inf", NEGATIVE_INFINITY},
|
||||
{"nan", NOT_A_NUMBER},
|
||||
{NULL, NOT_A_NUMBER},
|
||||
};
|
||||
|
||||
/* Multiplying value_type i with value_type j should yield value_type multiplication[i][j]. */
|
||||
const value_type multiplication[NUM_VALUE_TYPES][NUM_VALUE_TYPES] = {
|
||||
{ALL_POSITIVE, CONTAINS_ZERO, ALL_NEGATIVE, ANY_FINITE, POSITIVE_INFINITY,NEGATIVE_INFINITY,WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{CONTAINS_ZERO, CONTAINS_ZERO, CONTAINS_ZERO, ANY_FINITE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{ALL_NEGATIVE, CONTAINS_ZERO, ALL_POSITIVE, ANY_FINITE, NEGATIVE_INFINITY,POSITIVE_INFINITY,WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{ANY_FINITE, ANY_FINITE, ANY_FINITE, ANY_FINITE, ANY_INFINITE, ANY_INFINITE, WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{POSITIVE_INFINITY,WHOLE_LINE, NEGATIVE_INFINITY,ANY_INFINITE, POSITIVE_INFINITY,NEGATIVE_INFINITY,WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{NEGATIVE_INFINITY,WHOLE_LINE, POSITIVE_INFINITY,ANY_INFINITE, NEGATIVE_INFINITY,POSITIVE_INFINITY,WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, NOT_A_NUMBER},
|
||||
{ANY_INFINITE, ANY_INFINITE, ANY_INFINITE, ANY_INFINITE, ANY_INFINITE, ANY_INFINITE, WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER},
|
||||
};
|
||||
|
||||
/* Adding value_type i to value_type j should yield value_type addition[i][j]. */
|
||||
const value_type addition[NUM_VALUE_TYPES][NUM_VALUE_TYPES] = {
|
||||
{ALL_POSITIVE, ANY_FINITE, ANY_FINITE, ANY_FINITE, POSITIVE_INFINITY,NEGATIVE_INFINITY,WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{ANY_FINITE, CONTAINS_ZERO, ANY_FINITE, ANY_FINITE, POSITIVE_INFINITY,NEGATIVE_INFINITY,WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{ANY_FINITE, ANY_FINITE, ALL_NEGATIVE, ANY_FINITE, POSITIVE_INFINITY,NEGATIVE_INFINITY,WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{ANY_FINITE, ANY_FINITE, ANY_FINITE, ANY_FINITE, POSITIVE_INFINITY,NEGATIVE_INFINITY,WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{POSITIVE_INFINITY,POSITIVE_INFINITY,POSITIVE_INFINITY,POSITIVE_INFINITY,POSITIVE_INFINITY,WHOLE_LINE, WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{NEGATIVE_INFINITY,NEGATIVE_INFINITY,NEGATIVE_INFINITY,NEGATIVE_INFINITY,WHOLE_LINE, NEGATIVE_INFINITY,WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, WHOLE_LINE, NOT_A_NUMBER},
|
||||
{ANY_INFINITE, ANY_INFINITE, ANY_INFINITE, ANY_INFINITE, ANY_INFINITE, ANY_INFINITE, WHOLE_LINE, ANY_INFINITE, NOT_A_NUMBER},
|
||||
{NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER, NOT_A_NUMBER},
|
||||
};
|
||||
|
||||
int arb_satisfies_value_type(const arb_t x, const value_type t)
|
||||
{
|
||||
switch(t) {
|
||||
case ALL_POSITIVE:
|
||||
return arb_is_finite(x) && arb_is_positive(x);
|
||||
case CONTAINS_ZERO:
|
||||
return arb_is_finite(x) && arb_contains_zero(x);
|
||||
case ALL_NEGATIVE:
|
||||
return arb_is_finite(x) && arb_is_negative(x);
|
||||
case ANY_FINITE:
|
||||
return arb_is_finite(x);
|
||||
case POSITIVE_INFINITY:
|
||||
return !arb_is_finite(x) && arb_is_positive(x);
|
||||
case NEGATIVE_INFINITY:
|
||||
return !arb_is_finite(x) && arb_is_negative(x);
|
||||
case WHOLE_LINE:
|
||||
return !arb_is_finite(x) && arb_contains_zero(x);
|
||||
case ANY_INFINITE:
|
||||
return !arb_is_finite(x) && !arf_is_nan(arb_midref(x));
|
||||
case NOT_A_NUMBER:
|
||||
return arf_is_nan(arb_midref(x));
|
||||
default:
|
||||
printf("unexpected condition\n");
|
||||
flint_abort();
|
||||
}
|
||||
}
|
||||
|
||||
void print_arb_and_type(arb_t x, const char *s, const value_type t)
|
||||
{
|
||||
flint_printf("%s: ", s);
|
||||
arb_printd(x, PRINT_PRECISION);
|
||||
flint_printf(" of type: %d\n", t);
|
||||
}
|
||||
void print_arf_and_type(arf_t x, const char *s, const value_type t)
|
||||
{
|
||||
flint_printf("%s: ", s);
|
||||
arf_printd(x, PRINT_PRECISION);
|
||||
flint_printf(" of type: %d\n", t);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
slong i, j, k, prec;
|
||||
arb_t t, u, v, w;
|
||||
arf_t x;
|
||||
|
||||
flint_printf("pos_times_posinf....");
|
||||
fflush(stdout);
|
||||
|
||||
arb_init(t);
|
||||
arb_init(u);
|
||||
arb_init(v);
|
||||
arb_init(w);
|
||||
arf_init(x);
|
||||
|
||||
for(prec = 20; prec <= 100; prec += 80)
|
||||
for(i = 0; test_values_arb[i].value != NULL; ++i)
|
||||
{
|
||||
for(j = 0; test_values_arb[j].value != NULL; ++j)
|
||||
{
|
||||
value_type vt = test_values_arb[i].type, vu = test_values_arb[j].type, expected = multiplication[vt][vu];
|
||||
arb_set_str(t, test_values_arb[i].value, prec);
|
||||
arb_set_str(u, test_values_arb[j].value, prec);
|
||||
|
||||
arb_mul(v, t, u, prec);
|
||||
|
||||
if(!arb_satisfies_value_type(v, expected))
|
||||
{
|
||||
flint_printf("FAIL (arb_mul): %s, %s\n", test_values_arb[i].value, test_values_arb[j].value);
|
||||
print_arb_and_type(t, "t", vt);
|
||||
print_arb_and_type(u, "u", vu);
|
||||
flint_printf("v: ");
|
||||
arb_printd(v, PRINT_PRECISION);
|
||||
flint_printf("\nexpected type: %d\n", expected);
|
||||
flint_abort();
|
||||
}
|
||||
|
||||
for(k = 0; test_values_arb[k].value != NULL; ++k)
|
||||
{
|
||||
value_type vw = test_values_arb[k].type, expected = addition[vw][multiplication[vt][vu]];
|
||||
arb_set_str(w, test_values_arb[k].value, prec);
|
||||
|
||||
arb_addmul(w, t, u, prec);
|
||||
|
||||
if(!arb_satisfies_value_type(w, expected))
|
||||
{
|
||||
flint_printf("FAIL (arb_addmul): %s, %s, %s\n", test_values_arb[k].value, test_values_arb[i].value, test_values_arb[j].value);
|
||||
print_arb_and_type(t, "t", vt);
|
||||
print_arb_and_type(u, "u", vu);
|
||||
flint_printf("w (after): ");
|
||||
arb_printd(w, PRINT_PRECISION);
|
||||
flint_printf("\nexpected type: %d\n", expected);
|
||||
flint_abort();
|
||||
}
|
||||
|
||||
expected = addition[vw][multiplication[ALL_NEGATIVE][multiplication[vt][vu]]];
|
||||
arb_set_str(w, test_values_arb[k].value, prec);
|
||||
|
||||
arb_submul(w, t, u, prec);
|
||||
|
||||
if(!arb_satisfies_value_type(w, expected))
|
||||
{
|
||||
flint_printf("FAIL (arb_submul): %s, %s, %s\n", test_values_arb[k].value, test_values_arb[i].value, test_values_arb[j].value);
|
||||
print_arb_and_type(t, "t", vt);
|
||||
print_arb_and_type(u, "u", vu);
|
||||
flint_printf("w (after): ");
|
||||
arb_printd(w, PRINT_PRECISION);
|
||||
flint_printf("\nexpected type: %d\n", expected);
|
||||
flint_abort();
|
||||
}
|
||||
|
||||
expected = addition[vw][multiplication[vt][vu]];
|
||||
arb_set_str(w, test_values_arb[k].value, prec);
|
||||
|
||||
arb_fma(v, t, u, w, prec);
|
||||
if(!arb_satisfies_value_type(v, expected))
|
||||
{
|
||||
flint_printf("FAIL (arb_fma): %s, %s, %s\n", test_values_arb[k].value, test_values_arb[i].value, test_values_arb[j].value);
|
||||
print_arb_and_type(t, "t", vt);
|
||||
print_arb_and_type(u, "u", vu);
|
||||
flint_printf("v (after): ");
|
||||
arb_printd(v, PRINT_PRECISION);
|
||||
flint_printf("\nexpected type: %d\n", expected);
|
||||
flint_abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(j = 0; test_values_arf[j].value != NULL; ++j)
|
||||
{
|
||||
value_type vt = test_values_arb[i].type, vx = test_values_arf[j].type;
|
||||
arb_set_str(t, test_values_arb[i].value, prec);
|
||||
arb_set_str(w, test_values_arf[j].value, prec);
|
||||
arf_set(x, arb_midref(w));
|
||||
|
||||
arb_mul_arf(v, t, x, prec);
|
||||
|
||||
if(!arb_satisfies_value_type(v, multiplication[vt][vx]))
|
||||
{
|
||||
flint_printf("FAIL (arb_mul_arf): %s, %s\n", test_values_arb[i].value, test_values_arf[j].value);
|
||||
print_arb_and_type(t, "t", vt);
|
||||
print_arf_and_type(x, "x", vx);
|
||||
flint_printf("v: ");
|
||||
arb_printd(v, PRINT_PRECISION);
|
||||
flint_printf("\nexpected type: %d\n", multiplication[vt][vx]);
|
||||
flint_abort();
|
||||
}
|
||||
|
||||
for(k = 0; test_values_arb[k].value != NULL; ++k)
|
||||
{
|
||||
value_type vw = test_values_arb[k].type, expected = addition[vw][multiplication[vt][vx]];
|
||||
arb_set_str(w, test_values_arb[k].value, prec);
|
||||
|
||||
arb_addmul_arf(w, t, x, prec);
|
||||
|
||||
if(!arb_satisfies_value_type(w, expected))
|
||||
{
|
||||
flint_printf("FAIL (arb_addmul_arf): %s, %s, %s\n", test_values_arb[k].value, test_values_arb[i].value, test_values_arf[j].value);
|
||||
print_arb_and_type(t, "t", vt);
|
||||
print_arf_and_type(x, "x", vx);
|
||||
flint_printf("w (after): ");
|
||||
arb_printd(w, PRINT_PRECISION);
|
||||
flint_printf("\nexpected type: %d\n", expected);
|
||||
flint_abort();
|
||||
}
|
||||
|
||||
expected = addition[vw][multiplication[ALL_NEGATIVE][multiplication[vt][vx]]];
|
||||
arb_set_str(w, test_values_arb[k].value, prec);
|
||||
|
||||
arb_submul_arf(w, t, x, prec);
|
||||
|
||||
if(!arb_satisfies_value_type(w, expected))
|
||||
{
|
||||
flint_printf("FAIL (arb_submul_arf): %s, %s, %s\n", test_values_arb[k].value, test_values_arb[i].value, test_values_arf[j].value);
|
||||
print_arb_and_type(t, "t", vt);
|
||||
print_arf_and_type(x, "x", vx);
|
||||
flint_printf("w (after): ");
|
||||
arb_printd(w, PRINT_PRECISION);
|
||||
flint_printf("\nexpected type: %d\n", expected);
|
||||
flint_abort();
|
||||
}
|
||||
|
||||
expected = addition[vw][multiplication[vt][vx]];
|
||||
arb_set_str(w, test_values_arb[k].value, prec);
|
||||
|
||||
arb_fma_arf(v, t, x, w, prec);
|
||||
if(!arb_satisfies_value_type(v, expected))
|
||||
{
|
||||
flint_printf("FAIL (arb_fma): %s, %s, %s\n", test_values_arb[k].value, test_values_arb[i].value, test_values_arf[j].value);
|
||||
print_arb_and_type(t, "t", vt);
|
||||
print_arf_and_type(x, "x", vx);
|
||||
flint_printf("v (after): ");
|
||||
arb_printd(v, PRINT_PRECISION);
|
||||
flint_printf("\nexpected type: %d\n", expected);
|
||||
flint_abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
arf_clear(x);
|
||||
arb_clear(w);
|
||||
arb_clear(v);
|
||||
arb_clear(u);
|
||||
arb_clear(t);
|
||||
|
||||
flint_cleanup();
|
||||
flint_printf("PASS\n");
|
||||
return EXIT_SUCCESS;
|
||||
}
|
Loading…
Add table
Reference in a new issue