Skip to content

Commit 975a47d

Browse files
committed
WIP
1 parent 927d430 commit 975a47d

File tree

2 files changed

+70
-5
lines changed

2 files changed

+70
-5
lines changed

libm-test/tests/multiprecision.rs

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#![cfg(feature = "build-mpfr")]
44

55
use libm_test::generate::{case_list, edge_cases, random, spaced};
6-
use libm_test::mpfloat::MpOp;
6+
use libm_test::mpfloat::{MpFloat, MpOp};
77
use libm_test::{CheckBasis, CheckCtx, CheckOutput, GeneratorKind, MathOp, TupleCall};
88

99
const BASIS: CheckBasis = CheckBasis::Mpfr;
@@ -77,3 +77,65 @@ libm_macros::for_each_function! {
7777
nextafterf,
7878
],
7979
}
80+
81+
// fn mp_runner_rem_pio2<F: Float, Args>(ctx: &CheckCtx, cases: impl Iterator<Item = Args>) {
82+
// let x = MpFloat::new(prec)
83+
84+
// // let mut mp_vals = Op::new_mp();
85+
// for input in cases {
86+
// // let mp_res = Op::run(&mut mp_vals, input);
87+
// let crate_res = input.call_intercept_panics(Op::ROUTINE);
88+
89+
// crate_res.validate(mp_res, input, ctx).unwrap();
90+
// }
91+
// }
92+
93+
// macro_rules! mp_tests_rem_pio2 {
94+
// (
95+
// fn_name: $fn_name:ident,
96+
// attrs: [$($attr:meta),*],
97+
// ) => {
98+
// paste::paste! {
99+
// #[test]
100+
// $(#[$attr])*
101+
// fn [< mp_case_list_ $fn_name >]() {
102+
// type Op = libm_test::op::sin::Routine;
103+
// let ctx = CheckCtx::new(Op::IDENTIFIER, BASIS, GeneratorKind::List);
104+
// let cases = case_list::get_test_cases_basis::<Op>(&ctx).0;
105+
// mp_runner_rem_pio2(&ctx, cases);
106+
// }
107+
108+
// #[test]
109+
// $(#[$attr])*
110+
// fn [< mp_random_ $fn_name >]() {
111+
// type Op = libm_test::op::sin::Routine;
112+
// let ctx = CheckCtx::new(Op::IDENTIFIER, BASIS, GeneratorKind::Random);
113+
// let cases = random::get_test_cases::<<Op as MathOp>::RustArgs>(&ctx).0;
114+
// mp_runner_rem_pio2(&ctx, cases);
115+
// }
116+
117+
// #[test]
118+
// $(#[$attr])*
119+
// fn [< mp_edge_case_ $fn_name >]() {
120+
// type Op = libm_test::op::sin::Routine;
121+
// let ctx = CheckCtx::new(Op::IDENTIFIER, BASIS, GeneratorKind::EdgeCases);
122+
// let cases = edge_cases::get_test_cases::<Op>(&ctx).0;
123+
// mp_runner_rem_pio2(&ctx, cases);
124+
// }
125+
126+
// #[test]
127+
// $(#[$attr])*
128+
// fn [< mp_quickspace_ $fn_name >]() {
129+
// type Op = libm_test::op::sin::Routine;
130+
// let ctx = CheckCtx::new(Op::IDENTIFIER, BASIS, GeneratorKind::QuickSpaced);
131+
// let cases = spaced::get_test_cases::<Op>(&ctx).0;
132+
// mp_runner_rem_pio2(&ctx, cases);
133+
// }
134+
// }
135+
// };
136+
// }
137+
138+
// mp_tests_rem_pio2! {
139+
// fn_name: rem_pio2,
140+
// attrs: [],
141+
// }

libm/src/math/generic/rem_pio2.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ where
4242
fn large(x: &[Self], y: &mut [Self], e0: i32, prec: usize) -> i32;
4343
}
4444

45+
/// Return `x % pi/2` as `y[0] + y[1]`.
46+
///
47+
/// Caller must handle the case when reduction is not needed: `|x| ~<= pi/4`.
4548
pub(crate) fn rem_pio2<F>(x: F) -> (i32, F, F)
4649
where
4750
F: RemPio2Support,
@@ -56,14 +59,14 @@ where
5659
if ix <= F::FRAC_5PI_4_HI {
5760
/* |x| ~<= 5pi/4 */
5861
if (ix & F::SIG_MASK.hi()) == F::FRAC_PI_2_HI {
59-
/* |x| ~= pi/2 or 2pi/2 */
60-
return medium(x, ix); /* cancellation -- use medium case */
62+
// |x| ~= pi/2 or 2pi/2
63+
return medium(x, ix); // cancellation -- use medium case
6164
}
6265

6366
if ix <= F::FRAC_3PI_4_HI {
64-
/* |x| ~<= 3pi/4 */
67+
// |x| ~<= 3pi/4
6568
if pos {
66-
let z = x - F::PIO2_1; /* one round good to 85 bits */
69+
let z = x - F::PIO2_1; // one round good to 85 bits for f64
6770
let y0 = z - F::PIO2_1T;
6871
let y1 = (z - y0) - F::PIO2_1T;
6972
return (1, y0, y1);

0 commit comments

Comments
 (0)