Skip to content

Commit 53aa590

Browse files
committed
Change tests to understand different values of NaN
1 parent 194e645 commit 53aa590

File tree

1 file changed

+41
-16
lines changed

1 file changed

+41
-16
lines changed

src/float/add.rs

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ macro_rules! add {
130130
// If partial cancellation occured, we need to left-shift the result
131131
// and adjust the exponent:
132132
if a_significand < implicit_bit << 3 {
133-
let shift = (a_significand.0.leading_zeros()
134-
- (implicit_bit << 3).0.leading_zeros()) as i32;
133+
let shift = a_significand.0.leading_zeros() as i32
134+
- (implicit_bit << 3).0.leading_zeros() as i32;
135135
a_significand <<= shift as usize;
136136
a_exponent -= Wrapping(shift);
137137
}
@@ -205,15 +205,33 @@ mod test {
205205
// TODO: Add F32/F64 to qc so that they print the right values (at the very least)
206206
quickcheck! {
207207
fn addsf3(a: U32, b: U32) -> bool {
208-
let (a, b) = (a.0, b.0);
209-
let r = super::__addsf3(f32::from_repr(a), f32::from_repr(b));
210-
r.repr() == (f32::from_repr(a) + f32::from_repr(b)).repr()
208+
let (a, b) = (f32::from_repr(a.0), f32::from_repr(b.0));
209+
let x = super::__addsf3(a, b);
210+
let y = a + b;
211+
if x.is_nan() == y.is_nan() {
212+
if x.is_nan() {
213+
true
214+
} else {
215+
x.repr() == y.repr()
216+
}
217+
} else {
218+
false
219+
}
211220
}
212221

213222
fn adddf3(a: U64, b: U64) -> bool {
214-
let (a, b) = (a.0, b.0);
215-
let r = super::__adddf3(f64::from_repr(a), f64::from_repr(b));
216-
r.repr() == (f64::from_repr(a) + f64::from_repr(b)).repr()
223+
let (a, b) = (f64::from_repr(a.0), f64::from_repr(b.0));
224+
let x = super::__adddf3(a, b);
225+
let y = a + b;
226+
if x.is_nan() == y.is_nan() {
227+
if x.is_nan() {
228+
true
229+
} else {
230+
x.repr() == y.repr()
231+
}
232+
} else {
233+
false
234+
}
217235
}
218236
}
219237

@@ -262,19 +280,26 @@ mod test {
262280
}
263281

264282
#[test]
265-
fn test_float_tiny_plus_large() {
283+
fn test_float_different_nan() {
266284
let a = f32::from_repr(1);
267-
let b = f32::from_repr(4286990935);
268-
let r = super::__addsf3(a, b);
269-
assert_eq!(r.repr(), (a + b).repr());
285+
let b = f32::from_repr(0b11111111100100010001001010101010);
286+
let x = super::__addsf3(a, b);
287+
let y = a + b;
288+
if !(x.is_nan() && y.is_nan()) {
289+
assert_eq!(x.repr(), (a + b).repr());
290+
}
270291
}
271292

272293
#[test]
273-
fn test_double_tiny_plus_large() {
294+
fn test_double_different_nan() {
274295
let a = f64::from_repr(1);
275-
let b = f64::from_repr(4286990935);
276-
let r = super::__adddf3(a, b);
277-
assert_eq!(r.repr(), (a + b).repr());
296+
let b = f64::from_repr(
297+
0b1111111111110010001000100101010101001000101010000110100011101011);
298+
let x = super::__adddf3(a, b);
299+
let y = a + b;
300+
if !(x.is_nan() && y.is_nan()) {
301+
assert_eq!(x.repr(), (a + b).repr());
302+
}
278303
}
279304

280305
#[test]

0 commit comments

Comments
 (0)