Skip to content
This repository was archived by the owner on Apr 28, 2025. It is now read-only.

Commit 1351a39

Browse files
committed
wip
1 parent 70432c6 commit 1351a39

File tree

4 files changed

+62
-1
lines changed

4 files changed

+62
-1
lines changed

crates/libm-macros/tests/basic.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#![feature(f16)]
33
#![feature(f128)]
44
#![cfg(not(all(target_arch = "x86", target_os = "windows", target_env = "gnu")))]
5+
#![feature(f128)]
6+
#![feature(f16)]
57

68
macro_rules! basic {
79
(

crates/libm-test/src/gen.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,25 @@ pub mod random;
66
/// Helper type to turn any reusable input into a generator.
77
#[derive(Clone, Debug, Default)]
88
pub struct CachedInput {
9+
pub inputs_f16: Vec<(f16, f16, f16)>,
910
pub inputs_f32: Vec<(f32, f32, f32)>,
1011
pub inputs_f64: Vec<(f64, f64, f64)>,
12+
pub inputs_f128: Vec<(f128, f128, f128)>,
1113
pub inputs_i32: Vec<(i32, i32, i32)>,
1214
}
1315

16+
impl GenerateInput<(f16,)> for CachedInput {
17+
fn get_cases(&self) -> impl Iterator<Item = (f16,)> {
18+
self.inputs_f16.iter().map(|f| (f.0,))
19+
}
20+
}
21+
22+
impl GenerateInput<(f16, f16)> for CachedInput {
23+
fn get_cases(&self) -> impl Iterator<Item = (f16, f16)> {
24+
self.inputs_f16.iter().map(|f| (f.0, f.1))
25+
}
26+
}
27+
1428
impl GenerateInput<(f32,)> for CachedInput {
1529
fn get_cases(&self) -> impl Iterator<Item = (f32,)> {
1630
self.inputs_f32.iter().map(|f| (f.0,))
@@ -70,3 +84,15 @@ impl GenerateInput<(f64, f64, f64)> for CachedInput {
7084
self.inputs_f64.iter().copied()
7185
}
7286
}
87+
88+
impl GenerateInput<(f128,)> for CachedInput {
89+
fn get_cases(&self) -> impl Iterator<Item = (f128,)> {
90+
self.inputs_f128.iter().map(|f| (f.0,))
91+
}
92+
}
93+
94+
impl GenerateInput<(f128, f128)> for CachedInput {
95+
fn get_cases(&self) -> impl Iterator<Item = (f128, f128)> {
96+
self.inputs_f128.iter().map(|f| (f.0, f.1))
97+
}
98+
}

crates/libm-test/src/gen/random.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@ static TEST_CASES_JN: LazyLock<CachedInput> = LazyLock::new(|| {
4242
// These functions are extremely slow, limit them
4343
let ntests_jn = (NTESTS / 1000).max(80);
4444
cases.inputs_i32.truncate(ntests_jn);
45+
cases.inputs_f16.truncate(ntests_jn);
4546
cases.inputs_f32.truncate(ntests_jn);
4647
cases.inputs_f64.truncate(ntests_jn);
48+
cases.inputs_f128.truncate(ntests_jn);
4749

4850
// It is easy to overflow the stack with these in debug mode
4951
let max_iterations = if cfg!(optimizations_enabled) && cfg!(target_pointer_width = "64") {
@@ -68,6 +70,16 @@ fn make_test_cases(ntests: usize) -> CachedInput {
6870

6971
// make sure we include some basic cases
7072
let mut inputs_i32 = vec![(0, 0, 0), (1, 1, 1), (-1, -1, -1)];
73+
let mut inputs_f16 = vec![
74+
(0.0, 0.0, 0.0),
75+
(f16::EPSILON, f16::EPSILON, f16::EPSILON),
76+
(f16::INFINITY, f16::INFINITY, f16::INFINITY),
77+
(f16::NEG_INFINITY, f16::NEG_INFINITY, f16::NEG_INFINITY),
78+
(f16::MAX, f16::MAX, f16::MAX),
79+
(f16::MIN, f16::MIN, f16::MIN),
80+
(f16::MIN_POSITIVE, f16::MIN_POSITIVE, f16::MIN_POSITIVE),
81+
(f16::NAN, f16::NAN, f16::NAN),
82+
];
7183
let mut inputs_f32 = vec![
7284
(0.0, 0.0, 0.0),
7385
(f32::EPSILON, f32::EPSILON, f32::EPSILON),
@@ -88,11 +100,25 @@ fn make_test_cases(ntests: usize) -> CachedInput {
88100
(f64::MIN_POSITIVE, f64::MIN_POSITIVE, f64::MIN_POSITIVE),
89101
(f64::NAN, f64::NAN, f64::NAN),
90102
];
103+
let mut inputs_f128 = vec![
104+
(0.0, 0.0, 0.0),
105+
(f128::EPSILON, f128::EPSILON, f128::EPSILON),
106+
(f128::INFINITY, f128::INFINITY, f128::INFINITY),
107+
(f128::NEG_INFINITY, f128::NEG_INFINITY, f128::NEG_INFINITY),
108+
(f128::MAX, f128::MAX, f128::MAX),
109+
(f128::MIN, f128::MIN, f128::MIN),
110+
(f128::MIN_POSITIVE, f128::MIN_POSITIVE, f128::MIN_POSITIVE),
111+
(f128::NAN, f128::NAN, f128::NAN),
112+
];
91113

92114
inputs_i32.extend((0..(ntests - inputs_i32.len())).map(|_| rng.gen::<(i32, i32, i32)>()));
93115

94116
// Generate integers to get a full range of bitpatterns, then convert back to
95117
// floats.
118+
inputs_f16.extend((0..(ntests - inputs_f16.len())).map(|_| {
119+
let ints = rng.gen::<(u16, u16, u16)>();
120+
(f16::from_bits(ints.0), f16::from_bits(ints.1), f16::from_bits(ints.2))
121+
}));
96122
inputs_f32.extend((0..(ntests - inputs_f32.len())).map(|_| {
97123
let ints = rng.gen::<(u32, u32, u32)>();
98124
(f32::from_bits(ints.0), f32::from_bits(ints.1), f32::from_bits(ints.2))
@@ -101,8 +127,12 @@ fn make_test_cases(ntests: usize) -> CachedInput {
101127
let ints = rng.gen::<(u64, u64, u64)>();
102128
(f64::from_bits(ints.0), f64::from_bits(ints.1), f64::from_bits(ints.2))
103129
}));
130+
inputs_f128.extend((0..(ntests - inputs_f128.len())).map(|_| {
131+
let ints = rng.gen::<(u128, u128, u128)>();
132+
(f128::from_bits(ints.0), f128::from_bits(ints.1), f128::from_bits(ints.2))
133+
}));
104134

105-
CachedInput { inputs_f32, inputs_f64, inputs_i32 }
135+
CachedInput { inputs_f16, inputs_f32, inputs_f64, inputs_f128, inputs_i32 }
106136
}
107137

108138
/// Create a test case iterator.

crates/libm-test/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#![cfg_attr(f128_enabled, feature(f128))]
2+
#![cfg_attr(f16_enabled, feature(f16))]
3+
14
pub mod gen;
25
#[cfg(feature = "test-multiprecision")]
36
pub mod mpfloat;

0 commit comments

Comments
 (0)