Skip to content

Commit a53b50a

Browse files
mrowqaalexcrichton
authored andcommitted
x86: fixed testing equality of floating point numbers (rust-lang#150)
* x86: fixed testing equality of floating point numbers * x86: removed unused macro branch * x86: marked assert_approx_eq as used only in tests
1 parent 03abb5f commit a53b50a

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

src/x86/avx.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -3224,7 +3224,10 @@ mod tests {
32243224
let r = avx::_mm256_rcp_ps(a);
32253225
let e = f32x8::new(0.99975586, 0.49987793, 0.33325195, 0.24993896,
32263226
0.19995117, 0.16662598, 0.14282227, 0.12496948);
3227-
assert_eq!(r, e);
3227+
let rel_err = 0.00048828125;
3228+
for i in 0..8 {
3229+
assert_approx_eq!(r.extract(i), e.extract(i), 2. * rel_err);
3230+
}
32283231
}
32293232

32303233
#[simd_test = "avx"]
@@ -3233,7 +3236,10 @@ mod tests {
32333236
let r = avx::_mm256_rsqrt_ps(a);
32343237
let e = f32x8::new(0.99975586, 0.7069092, 0.5772705, 0.49987793,
32353238
0.44714355, 0.40820313, 0.3779297, 0.3534546);
3236-
assert_eq!(r, e);
3239+
let rel_err = 0.00048828125;
3240+
for i in 0..8 {
3241+
assert_approx_eq!(r.extract(i), e.extract(i), 2. * rel_err);
3242+
}
32373243
}
32383244

32393245
#[simd_test = "avx"]

src/x86/macros.rs

+11
Original file line numberDiff line numberDiff line change
@@ -338,4 +338,15 @@ macro_rules! constify_imm2 {
338338
}
339339
}
340340

341+
#[cfg(test)]
342+
macro_rules! assert_approx_eq {
343+
($a:expr, $b:expr, $eps:expr) => ({
344+
let (a, b) = (&$a, &$b);
345+
assert!((*a - *b).abs() < $eps,
346+
"assertion failed: `(left !== right)` \
347+
(left: `{:?}`, right: `{:?}`, expect diff: `{:?}`, real diff: `{:?}`)",
348+
*a, *b, $eps, (*a - *b).abs());
349+
})
350+
}
351+
341352

src/x86/sse.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -1804,23 +1804,32 @@ mod tests {
18041804
let a = f32x4::new(4.0, 13.0, 16.0, 100.0);
18051805
let r = sse::_mm_rcp_ps(a);
18061806
let e = f32x4::new(0.24993896, 0.0769043, 0.06248474, 0.0099983215);
1807-
assert_eq!(r, e);
1807+
let rel_err = 0.00048828125;
1808+
for i in 0..4 {
1809+
assert_approx_eq!(r.extract(i), e.extract(i), 2. * rel_err);
1810+
}
18081811
}
18091812

18101813
#[simd_test = "sse"]
18111814
unsafe fn _mm_rsqrt_ss() {
18121815
let a = f32x4::new(4.0, 13.0, 16.0, 100.0);
18131816
let r = sse::_mm_rsqrt_ss(a);
18141817
let e = f32x4::new(0.49987793, 13.0, 16.0, 100.0);
1815-
assert_eq!(r, e);
1818+
let rel_err = 0.00048828125;
1819+
for i in 0..4 {
1820+
assert_approx_eq!(r.extract(i), e.extract(i), 2. * rel_err);
1821+
}
18161822
}
18171823

18181824
#[simd_test = "sse"]
18191825
unsafe fn _mm_rsqrt_ps() {
18201826
let a = f32x4::new(4.0, 13.0, 16.0, 100.0);
18211827
let r = sse::_mm_rsqrt_ps(a);
18221828
let e = f32x4::new(0.49987793, 0.2772827, 0.24993896, 0.099990845);
1823-
assert_eq!(r, e);
1829+
let rel_err = 0.00048828125;
1830+
for i in 0..4 {
1831+
assert_approx_eq!(r.extract(i), e.extract(i), 2. * rel_err);
1832+
}
18241833
}
18251834

18261835
#[simd_test = "sse"]

0 commit comments

Comments
 (0)