Skip to content

Commit 2a52f32

Browse files
committed
Change default ULP to use enum matching
Migrate from string to enum matching and tie this to `CheckCtx::new`, so no tests need to explicitly set ULP.
1 parent d7721d1 commit 2a52f32

File tree

6 files changed

+47
-59
lines changed

6 files changed

+47
-59
lines changed

crates/libm-test/benches/random.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ where
4949
{
5050
let name = Op::NAME;
5151

52-
let ulp = libm_test::musl_allowed_ulp(name);
53-
let ctx = CheckCtx::new(ulp, Op::IDENTIFIER, CheckBasis::Musl);
52+
let ctx = CheckCtx::new(Op::IDENTIFIER, CheckBasis::Musl);
5453
let benchvec: Vec<_> =
5554
random::get_test_cases::<Op::RustArgs>(&ctx).take(BENCH_ITER_ITEMS).collect();
5655

crates/libm-test/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ mod test_traits;
77

88
pub use libm::support::{Float, Int};
99
pub use op::{BaseName, Identifier, MathOp};
10-
pub use precision::{MaybeOverride, SpecialCase, multiprec_allowed_ulp, musl_allowed_ulp};
10+
pub use precision::{MaybeOverride, SpecialCase, default_ulp};
1111
pub use test_traits::{CheckBasis, CheckCtx, CheckOutput, GenerateInput, Hex, TupleCall};
1212

1313
/// Result type for tests is usually from `anyhow`. Most times there is no success value to

crates/libm-test/src/precision.rs

+34-39
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
44
use core::f32;
55

6-
use crate::{CheckBasis, CheckCtx, Float, Int, TestResult};
6+
use CheckBasis::{Mpfr, Musl};
7+
use Identifier as Id;
8+
9+
use crate::{CheckBasis, CheckCtx, Float, Identifier, Int, TestResult};
710

811
/// Type implementing [`IgnoreCase`].
912
pub struct SpecialCase;
@@ -14,50 +17,42 @@ const MUSL_DEFAULT_ULP: u32 = 2;
1417
/// Default ULP allowed to differ from multiprecision (i.e. infinite) results.
1518
const MULTIPREC_DEFAULT_ULP: u32 = 1;
1619

17-
/// ULP allowed to differ from muls results.
20+
/// ULP allowed to differ from the results returned by a test basis.
1821
///
19-
/// Note that these results were obtained using 400,000,000 rounds of random inputs, which
22+
/// Note that these results were obtained using 400M rounds of random inputs, which
2023
/// is not a value used by default.
21-
pub fn musl_allowed_ulp(name: &str) -> u32 {
22-
// Consider overrides xfail
23-
match name {
24-
#[cfg(x86_no_sse)]
25-
"asinh" | "asinhf" => 6,
26-
"lgamma" | "lgamma_r" | "lgammaf" | "lgammaf_r" => 400,
27-
"tanh" | "tanhf" => 4,
28-
"tgamma" => 20,
29-
"j0" | "j0f" | "j1" | "j1f" => {
24+
pub fn default_ulp(ctx: &CheckCtx) -> u32 {
25+
match (&ctx.basis, ctx.fn_ident) {
26+
// Overrides that apply to either basis
27+
(_, Id::J0 | Id::J0f | Id::J1 | Id::J1f) => {
3028
// Results seem very target-dependent
3129
if cfg!(target_arch = "x86_64") { 4000 } else { 800_000 }
3230
}
33-
"jn" | "jnf" => 1000,
34-
"sincosf" => 500,
35-
#[cfg(not(target_pointer_width = "64"))]
36-
"exp10" => 4,
37-
#[cfg(not(target_pointer_width = "64"))]
38-
"exp10f" => 4,
39-
_ => MUSL_DEFAULT_ULP,
40-
}
41-
}
31+
(_, Id::Jn | Id::Jnf) => 1000,
4232

43-
/// ULP allowed to differ from multiprecision results.
44-
pub fn multiprec_allowed_ulp(name: &str) -> u32 {
45-
// Consider overrides xfail
46-
match name {
47-
"asinh" | "asinhf" => 2,
48-
"acoshf" => 4,
49-
"atanh" | "atanhf" => 2,
50-
"exp10" | "exp10f" => 3,
51-
"j0" | "j0f" | "j1" | "j1f" => {
52-
// Results seem very target-dependent
53-
if cfg!(target_arch = "x86_64") { 4000 } else { 800_000 }
54-
}
55-
"jn" | "jnf" => 1000,
56-
"lgamma" | "lgammaf" | "lgamma_r" | "lgammaf_r" => 16,
57-
"sinh" | "sinhf" => 2,
58-
"tanh" | "tanhf" => 2,
59-
"tgamma" => 20,
60-
_ => MULTIPREC_DEFAULT_ULP,
33+
// Overrides for musl
34+
#[cfg(x86_no_sse)]
35+
(Musl, Id::Asinh | Id::Asinhf) => 6,
36+
#[cfg(not(target_pointer_width = "64"))]
37+
(Musl, Id::Exp10 | Id::Exp10f) => 4,
38+
(Musl, Id::Lgamma | Id::LgammaR | Id::Lgammaf | Id::LgammafR) => 400,
39+
(Musl, Id::Sincosf) => 500,
40+
(Musl, Id::Tanh | Id::Tanhf) => 4,
41+
(Musl, Id::Tgamma) => 20,
42+
43+
// Overrides for MPFR
44+
(Mpfr, Id::Acoshf) => 4,
45+
(Mpfr, Id::Asinh | Id::Asinhf) => 2,
46+
(Mpfr, Id::Atanh | Id::Atanhf) => 2,
47+
(Mpfr, Id::Exp10 | Id::Exp10f) => 3,
48+
(Mpfr, Id::Lgamma | Id::LgammaR | Id::Lgammaf | Id::LgammafR) => 16,
49+
(Mpfr, Id::Sinh | Id::Sinhf) => 2,
50+
(Mpfr, Id::Tanh | Id::Tanhf) => 2,
51+
(Mpfr, Id::Tgamma) => 20,
52+
53+
// Defaults
54+
(Musl, _) => MUSL_DEFAULT_ULP,
55+
(Mpfr, _) => MULTIPREC_DEFAULT_ULP,
6156
}
6257
}
6358

crates/libm-test/src/test_traits.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,18 @@ pub struct CheckCtx {
2929
}
3030

3131
impl CheckCtx {
32-
pub fn new(ulp: u32, fn_ident: Identifier, basis: CheckBasis) -> Self {
33-
Self {
34-
ulp,
32+
/// Create a new check context, using the default ULP for the function.
33+
pub fn new(fn_ident: Identifier, basis: CheckBasis) -> Self {
34+
let mut ret = Self {
35+
ulp: 0,
3536
fn_ident,
3637
fn_name: fn_ident.as_str(),
3738
base_name: fn_ident.base_name(),
3839
base_name_str: fn_ident.base_name().as_str(),
3940
basis,
40-
}
41+
};
42+
ret.ulp = crate::default_ulp(&ret);
43+
ret
4144
}
4245
}
4346

crates/libm-test/tests/compare_built_musl.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@
1010
#![cfg(feature = "build-musl")]
1111

1212
use libm_test::gen::{CachedInput, random};
13-
use libm_test::{
14-
CheckBasis, CheckCtx, CheckOutput, GenerateInput, MathOp, TupleCall, musl_allowed_ulp,
15-
};
13+
use libm_test::{CheckBasis, CheckCtx, CheckOutput, GenerateInput, MathOp, TupleCall};
1614

1715
macro_rules! musl_rand_tests {
1816
(
@@ -34,9 +32,7 @@ where
3432
Op: MathOp,
3533
CachedInput: GenerateInput<Op::RustArgs>,
3634
{
37-
let name = Op::NAME;
38-
let ulp = musl_allowed_ulp(name);
39-
let ctx = CheckCtx::new(ulp, Op::IDENTIFIER, CheckBasis::Musl);
35+
let ctx = CheckCtx::new(Op::IDENTIFIER, CheckBasis::Musl);
4036
let cases = random::get_test_cases::<Op::RustArgs>(&ctx);
4137

4238
for input in cases {

crates/libm-test/tests/multiprecision.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44

55
use libm_test::gen::{CachedInput, random};
66
use libm_test::mpfloat::MpOp;
7-
use libm_test::{
8-
CheckBasis, CheckCtx, CheckOutput, GenerateInput, MathOp, TupleCall, multiprec_allowed_ulp,
9-
};
7+
use libm_test::{CheckBasis, CheckCtx, CheckOutput, GenerateInput, MathOp, TupleCall};
108

119
/// Implement a test against MPFR with random inputs.
1210
macro_rules! multiprec_rand_tests {
@@ -29,11 +27,8 @@ where
2927
Op: MathOp + MpOp,
3028
CachedInput: GenerateInput<Op::RustArgs>,
3129
{
32-
let name = Op::NAME;
33-
34-
let ulp = multiprec_allowed_ulp(name);
3530
let mut mp_vals = Op::new_mp();
36-
let ctx = CheckCtx::new(ulp, Op::IDENTIFIER, CheckBasis::Mpfr);
31+
let ctx = CheckCtx::new(Op::IDENTIFIER, CheckBasis::Mpfr);
3732
let cases = random::get_test_cases::<Op::RustArgs>(&ctx);
3833

3934
for input in cases {

0 commit comments

Comments
 (0)