Example #1
0
File: sub.c Project: argriffing/arb
static slong _fmpr_sub_special(fmpr_t z, const fmpr_t x, const fmpr_t y, slong prec, fmpr_rnd_t rnd)
{
    if (fmpr_is_zero(x))
    {
        return fmpr_neg_round(z, y, prec, rnd);
    }
    else if (fmpr_is_zero(y))
    {
        return fmpr_set_round(z, x, prec, rnd);
    }
    else if (fmpr_is_nan(x) || fmpr_is_nan(y)
        || (fmpr_is_pos_inf(x) && fmpr_is_pos_inf(y))
        || (fmpr_is_neg_inf(x) && fmpr_is_neg_inf(y)))
    {
        fmpr_nan(z);
        return FMPR_RESULT_EXACT;
    }
    else if (fmpr_is_special(x))
    {
        fmpr_set(z, x);
        return FMPR_RESULT_EXACT;
    }
    else
    {
        fmpr_neg(z, y);
        return FMPR_RESULT_EXACT;
    }
}
Example #2
0
static __inline__ void
fmpcb_inv_mid(fmpcb_t z, const fmpcb_t x, long prec)
{
    fmpr_t t;
    fmpr_init(t);

#define a fmprb_midref(fmpcb_realref(x))
#define b fmprb_midref(fmpcb_imagref(x))
#define e fmprb_midref(fmpcb_realref(z))
#define f fmprb_midref(fmpcb_imagref(z))

    fmpr_mul(t, a, a, prec, FMPR_RND_DOWN);
    fmpr_addmul(t, b, b, prec, FMPR_RND_DOWN);

    fmpr_div(e, a, t, prec, FMPR_RND_DOWN);
    fmpr_div(f, b, t, prec, FMPR_RND_DOWN);

    fmpr_neg(f, f);

#undef a
#undef b
#undef e
#undef f

    fmpr_clear(t);
}
Example #3
0
int
fmprb_contains(const fmprb_t x, const fmprb_t y)
{
    fmpr_t t;
    fmpr_t u;
    fmpr_struct tmp[4];
    int left_ok, right_ok;

    if (fmprb_is_exact(y))
        return fmprb_contains_fmpr(x, fmprb_midref(y));

    if (fmpr_is_nan(fmprb_midref(y)))
        return fmpr_is_nan(fmprb_midref(x));

    fmpr_init(t);
    fmpr_init(u);

    /* fast check */
    fmpr_sub(t, fmprb_midref(x), fmprb_radref(x), 30, FMPR_RND_CEIL);
    fmpr_sub(u, fmprb_midref(y), fmprb_radref(y), 30, FMPR_RND_FLOOR);
    left_ok = fmpr_cmp(t, u) <= 0;

    /* exact check */
    if (!left_ok)
    {
        fmpr_init(tmp + 0);
        fmpr_init(tmp + 1);
        fmpr_init(tmp + 2);
        fmpr_init(tmp + 3);

        fmpr_set(tmp + 0, fmprb_midref(x));
        fmpr_neg(tmp + 1, fmprb_radref(x));
        fmpr_neg(tmp + 2, fmprb_midref(y));
        fmpr_set(tmp + 3, fmprb_radref(y));

        fmpr_sum(t, tmp, 4, 30, FMPR_RND_DOWN);
        left_ok = fmpr_sgn(t) <= 0;

        fmpr_clear(tmp + 0);
        fmpr_clear(tmp + 1);
        fmpr_clear(tmp + 2);
        fmpr_clear(tmp + 3);
    }

    /* fast check */
    fmpr_add(t, fmprb_midref(x), fmprb_radref(x), 30, FMPR_RND_FLOOR);
    fmpr_add(u, fmprb_midref(y), fmprb_radref(y), 30, FMPR_RND_CEIL);
    right_ok = (fmpr_cmp(t, u) >= 0);

    /* exact check */
    if (!right_ok)
    {
        fmpr_init(tmp + 0);
        fmpr_init(tmp + 1);
        fmpr_init(tmp + 2);
        fmpr_init(tmp + 3);

        fmpr_set(tmp + 0, fmprb_midref(x));
        fmpr_set(tmp + 1, fmprb_radref(x));
        fmpr_neg(tmp + 2, fmprb_midref(y));
        fmpr_neg(tmp + 3, fmprb_radref(y));

        fmpr_sum(t, tmp, 4, 30, FMPR_RND_DOWN);
        right_ok = fmpr_sgn(t) >= 0;

        fmpr_clear(tmp + 0);
        fmpr_clear(tmp + 1);
        fmpr_clear(tmp + 2);
        fmpr_clear(tmp + 3);
    }

    fmpr_clear(t);
    fmpr_clear(u);

    return left_ok && right_ok;
}