diff --git a/arf.h b/arf.h index 30f722d7..2c193f52 100644 --- a/arf.h +++ b/arf.h @@ -610,8 +610,9 @@ int arf_get_mpfr(mpfr_t x, const arf_t y, mpfr_rnd_t rnd); void arf_set_mpfr(arf_t x, const mpfr_t y); int arf_equal(const arf_t x, const arf_t y); - int arf_equal_si(const arf_t x, slong y); +int arf_equal_ui(const arf_t x, ulong y); +int arf_equal_d(const arf_t x, double y); ARF_INLINE void arf_min(arf_t z, const arf_t a, const arf_t b) diff --git a/arf/equal.c b/arf/equal.c index 96aa721c..09010b27 100644 --- a/arf/equal.c +++ b/arf/equal.c @@ -48,3 +48,19 @@ arf_equal_si(const arf_t x, slong y) return arf_equal(x, t); /* no need to free */ } +int +arf_equal_ui(const arf_t x, ulong y) +{ + arf_t t; + arf_init_set_ui(t, y); + return arf_equal(x, t); /* no need to free */ +} + +int +arf_equal_d(const arf_t x, double y) +{ + arf_t t; + arf_init(t); + arf_set_d(t, y); + return arf_equal(x, t); /* no need to free */ +} diff --git a/arf/test/t-set_d.c b/arf/test/t-set_d.c index 12bd3bc9..ab417926 100644 --- a/arf/test/t-set_d.c +++ b/arf/test/t-set_d.c @@ -37,7 +37,7 @@ int main() mpfr_set_d(m, x, MPFR_RNDN); arf_set_mpfr(z, m); - if (!arf_equal(y, z)) + if (!arf_equal(y, z) || !arf_equal_d(y, x)) { flint_printf("FAIL:\n\n"); flint_printf("x = %.17g\n\n", x); diff --git a/arf/test/t-set_round_ui.c b/arf/test/t-set_round_ui.c index d18e17be..39f693f4 100644 --- a/arf/test/t-set_round_ui.c +++ b/arf/test/t-set_round_ui.c @@ -61,7 +61,7 @@ int main() ret2 = arf_set_round_ui(y, t, prec, rnd); - if (!arf_equal(x, y) || (ret1 != ret2)) + if (!arf_equal(x, y) || (ret1 != ret2) || (ret2 == 0 && !arf_equal_ui(y, t))) { flint_printf("FAIL\n\n"); flint_printf("prec = %wd", prec); flint_printf("\n\n"); @@ -81,4 +81,3 @@ int main() flint_printf("PASS\n"); return EXIT_SUCCESS; } - diff --git a/doc/source/arf.rst b/doc/source/arf.rst index 56bdcf81..c4bd7c59 100644 --- a/doc/source/arf.rst +++ b/doc/source/arf.rst @@ -323,11 +323,15 @@ Comparisons and bounds ------------------------------------------------------------------------------- .. function:: int arf_equal(const arf_t x, const arf_t y) + int arf_equal_si(const arf_t x, slong y) + int arf_equal_ui(const arf_t x, ulong y) + int arf_equal_d(const arf_t x, double y) -.. function:: int arf_equal_si(const arf_t x, slong y) + Returns nonzero iff *x* and *y* are exactly equal. NaN is not + treated specially, i.e. NaN compares as equal to itself. - Returns nonzero iff *x* and *y* are exactly equal. This function does - not treat NaN specially, i.e. NaN compares as equal to itself. + For comparison with a *double*, the values -0 and +0 are + both treated as zero, and all NaN values are treated as identical. .. function:: int arf_cmp(const arf_t x, const arf_t y)