2020-11-29 08:41:16 +08:00
|
|
|
use super::Complex;
|
|
|
|
|
2020-12-05 01:09:23 +08:00
|
|
|
pub fn isclose(a: f32, b: f32, rtol: f32, atol: f32) -> bool {
|
|
|
|
(a - b).abs() <= a.abs().max(b.abs()) * rtol + atol
|
2020-11-29 08:41:16 +08:00
|
|
|
}
|
|
|
|
|
2020-12-05 01:09:23 +08:00
|
|
|
pub fn complex_isclose(
|
2020-11-29 08:41:16 +08:00
|
|
|
a: Complex<f32>,
|
|
|
|
b: Complex<f32>,
|
2020-12-05 01:09:23 +08:00
|
|
|
rtol: f32,
|
|
|
|
atol: f32,
|
2020-11-29 08:41:16 +08:00
|
|
|
) -> bool {
|
2020-12-05 01:09:23 +08:00
|
|
|
isclose(a.0, b.0, rtol, atol) && isclose(a.1, b.1, rtol, atol)
|
2020-11-29 08:41:16 +08:00
|
|
|
}
|
|
|
|
|
2020-12-05 01:09:23 +08:00
|
|
|
pub fn complex_allclose(
|
2020-11-29 08:41:16 +08:00
|
|
|
a: &[Complex<f32>],
|
|
|
|
b: &[Complex<f32>],
|
2020-12-05 01:09:23 +08:00
|
|
|
rtol: f32,
|
|
|
|
atol: f32,
|
2020-11-29 08:41:16 +08:00
|
|
|
) -> bool {
|
|
|
|
let mut result: bool = true;
|
|
|
|
a.iter().zip(b.iter()).for_each(|(i, j)| {
|
2020-12-05 01:09:23 +08:00
|
|
|
result &= complex_isclose(*i, *j, rtol, atol);
|
2020-11-29 08:41:16 +08:00
|
|
|
});
|
|
|
|
result
|
|
|
|
}
|