Increase the tolerance for jn and yn

These still fail random tests, e.g.:

    called `Result::unwrap()` on an `Err` value: jn

    Caused by:
        0:
               input:    (1068, -16013.98381387313)
               as hex:   (, -0x1.f46fded9ced39p+13)
               as bits:  (0x0000042c, 0xc0cf46fded9ced39)
               expected: 6.7603314308122506e-6  0x1.c5ad9c102d413p-18 0x3edc5ad9c102d413
               actual:   6.7603314308006335e-6  0x1.c5ad9c1029e80p-18 0x3edc5ad9c1029e80
        1: ulp 13715 > 4000

    Caused by:
        0:
               input:    (195, 42147.94)
               as hex:   (, 0x1.4947e2p+15)
               as bits:  (0x000000c3, 0x4724a3f1)
               expected: -2.13669e-7            -0x1.cad9c6p-23 0xb4656ce3
               actual:   -2.1376937e-7          -0x1.cb10f4p-23 0xb465887a
        1: ulp 7063 > 4000

    Caused by:
        0:
               input:    (194, 740.1916)
               as hex:   (, 0x1.721886p+9)
               as bits:  (0x000000c2, 0x44390c43)
               expected: 1.212096e-6            0x1.455e9ap-20 0x35a2af4d
               actual:   1.2172386e-6           0x1.46c000p-20 0x35a36000
        1: ulp 45235 > 10000

Increase allowed precision to avoid spurious failures.
This commit is contained in:
Trevor Gross 2025-02-10 02:05:41 +00:00 committed by Trevor Gross
parent 017f1035f1
commit 1efdc96974

View file

@ -523,18 +523,7 @@ fn int_float_common<F1: Float, F2: Float>(
&& actual == F2::ZERO
&& expected == F2::ZERO
{
return XFAIL("mpfr b");
}
// Our bessel functions blow up with large N values
if ctx.basis == Musl && (ctx.base_name == BaseName::Jn || ctx.base_name == BaseName::Yn) {
if input.0 > 4000 {
return XFAIL_NOCHECK;
} else if input.0 > 2000 {
return CheckAction::AssertWithUlp(20_000);
} else if input.0 > 1000 {
return CheckAction::AssertWithUlp(4_000);
}
return XFAIL("we disagree with MPFR on the sign of zero");
}
// Values near infinity sometimes get cut off for us. `ynf(681, 509.90924) = -inf` but should
@ -549,6 +538,19 @@ fn int_float_common<F1: Float, F2: Float>(
return XFAIL_NOCHECK;
}
// Our bessel functions blow up with large N values
if ctx.basis == Musl && (ctx.base_name == BaseName::Jn || ctx.base_name == BaseName::Yn) {
if cfg!(x86_no_sse) {
// Precision is especially bad on i586, not worth checking.
return XFAIL_NOCHECK;
}
if input.0 > 4000 {
return XFAIL_NOCHECK;
} else if input.0 > 100 {
return CheckAction::AssertWithUlp(1_000_000);
}
}
DEFAULT
}