Skip to content

Commit f2c471b

Browse files
committed
Auto merge of #141669 - tgross35:float-test-cleanup, r=<try>
float: Replace some approximate assertions with exact As was mentioned at [1], we currently use `assert_approx_eq` for testing some math functions that guarantee exact results. Replace approximate assertions with exact ones for the following: * `ceil` * `floor` * `fract` * `from_bits` * `mul_add` * `round_ties_even` * `round` * `trunc` This likely wasn't done in the past to avoid writing out exact decimals that don't match the intuitive answer (e.g. 1.3 - 1.0 = 0.300...004), but ensuring our results are accurate seems more important here. [1]: #138087 (comment) The first commit is a small bit of macro cleanup. try-job: aarch64-gnu
2 parents 40311c4 + b94d32e commit f2c471b

File tree

5 files changed

+429
-452
lines changed

5 files changed

+429
-452
lines changed

library/coretests/tests/floats/f128.rs

Lines changed: 103 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,6 @@ const NAN_MASK1: u128 = 0x0000aaaaaaaaaaaaaaaaaaaaaaaaaaaa;
3939
/// Second pattern over the mantissa
4040
const NAN_MASK2: u128 = 0x00005555555555555555555555555555;
4141

42-
/// Compare by representation
43-
#[allow(unused_macros)]
44-
macro_rules! assert_f128_biteq {
45-
($a:expr, $b:expr) => {
46-
let (l, r): (&f128, &f128) = (&$a, &$b);
47-
let lb = l.to_bits();
48-
let rb = r.to_bits();
49-
assert_eq!(lb, rb, "float {l:?} is not bitequal to {r:?}.\na: {lb:#034x}\nb: {rb:#034x}");
50-
};
51-
}
52-
5342
#[test]
5443
fn test_num_f128() {
5544
// FIXME(f16_f128): replace with a `test_num` call once the required `fmodl`/`fmodf128`
@@ -260,98 +249,98 @@ fn test_classify() {
260249
#[cfg(not(miri))]
261250
#[cfg(target_has_reliable_f128_math)]
262251
fn test_floor() {
263-
assert_approx_eq!(1.0f128.floor(), 1.0f128, TOL_PRECISE);
264-
assert_approx_eq!(1.3f128.floor(), 1.0f128, TOL_PRECISE);
265-
assert_approx_eq!(1.5f128.floor(), 1.0f128, TOL_PRECISE);
266-
assert_approx_eq!(1.7f128.floor(), 1.0f128, TOL_PRECISE);
267-
assert_approx_eq!(0.0f128.floor(), 0.0f128, TOL_PRECISE);
268-
assert_approx_eq!((-0.0f128).floor(), -0.0f128, TOL_PRECISE);
269-
assert_approx_eq!((-1.0f128).floor(), -1.0f128, TOL_PRECISE);
270-
assert_approx_eq!((-1.3f128).floor(), -2.0f128, TOL_PRECISE);
271-
assert_approx_eq!((-1.5f128).floor(), -2.0f128, TOL_PRECISE);
272-
assert_approx_eq!((-1.7f128).floor(), -2.0f128, TOL_PRECISE);
252+
assert_eq!(1.0f128.floor(), 1.0f128);
253+
assert_eq!(1.3f128.floor(), 1.0f128);
254+
assert_eq!(1.5f128.floor(), 1.0f128);
255+
assert_eq!(1.7f128.floor(), 1.0f128);
256+
assert_eq!(0.0f128.floor(), 0.0f128);
257+
assert_eq!((-0.0f128).floor(), -0.0f128);
258+
assert_eq!((-1.0f128).floor(), -1.0f128);
259+
assert_eq!((-1.3f128).floor(), -2.0f128);
260+
assert_eq!((-1.5f128).floor(), -2.0f128);
261+
assert_eq!((-1.7f128).floor(), -2.0f128);
273262
}
274263

275264
#[test]
276265
#[cfg(not(miri))]
277266
#[cfg(target_has_reliable_f128_math)]
278267
fn test_ceil() {
279-
assert_approx_eq!(1.0f128.ceil(), 1.0f128, TOL_PRECISE);
280-
assert_approx_eq!(1.3f128.ceil(), 2.0f128, TOL_PRECISE);
281-
assert_approx_eq!(1.5f128.ceil(), 2.0f128, TOL_PRECISE);
282-
assert_approx_eq!(1.7f128.ceil(), 2.0f128, TOL_PRECISE);
283-
assert_approx_eq!(0.0f128.ceil(), 0.0f128, TOL_PRECISE);
284-
assert_approx_eq!((-0.0f128).ceil(), -0.0f128, TOL_PRECISE);
285-
assert_approx_eq!((-1.0f128).ceil(), -1.0f128, TOL_PRECISE);
286-
assert_approx_eq!((-1.3f128).ceil(), -1.0f128, TOL_PRECISE);
287-
assert_approx_eq!((-1.5f128).ceil(), -1.0f128, TOL_PRECISE);
288-
assert_approx_eq!((-1.7f128).ceil(), -1.0f128, TOL_PRECISE);
268+
assert_eq!(1.0f128.ceil(), 1.0f128);
269+
assert_eq!(1.3f128.ceil(), 2.0f128);
270+
assert_eq!(1.5f128.ceil(), 2.0f128);
271+
assert_eq!(1.7f128.ceil(), 2.0f128);
272+
assert_eq!(0.0f128.ceil(), 0.0f128);
273+
assert_eq!((-0.0f128).ceil(), -0.0f128);
274+
assert_eq!((-1.0f128).ceil(), -1.0f128);
275+
assert_eq!((-1.3f128).ceil(), -1.0f128);
276+
assert_eq!((-1.5f128).ceil(), -1.0f128);
277+
assert_eq!((-1.7f128).ceil(), -1.0f128);
289278
}
290279

291280
#[test]
292281
#[cfg(not(miri))]
293282
#[cfg(target_has_reliable_f128_math)]
294283
fn test_round() {
295-
assert_approx_eq!(2.5f128.round(), 3.0f128, TOL_PRECISE);
296-
assert_approx_eq!(1.0f128.round(), 1.0f128, TOL_PRECISE);
297-
assert_approx_eq!(1.3f128.round(), 1.0f128, TOL_PRECISE);
298-
assert_approx_eq!(1.5f128.round(), 2.0f128, TOL_PRECISE);
299-
assert_approx_eq!(1.7f128.round(), 2.0f128, TOL_PRECISE);
300-
assert_approx_eq!(0.0f128.round(), 0.0f128, TOL_PRECISE);
301-
assert_approx_eq!((-0.0f128).round(), -0.0f128, TOL_PRECISE);
302-
assert_approx_eq!((-1.0f128).round(), -1.0f128, TOL_PRECISE);
303-
assert_approx_eq!((-1.3f128).round(), -1.0f128, TOL_PRECISE);
304-
assert_approx_eq!((-1.5f128).round(), -2.0f128, TOL_PRECISE);
305-
assert_approx_eq!((-1.7f128).round(), -2.0f128, TOL_PRECISE);
284+
assert_eq!(2.5f128.round(), 3.0f128);
285+
assert_eq!(1.0f128.round(), 1.0f128);
286+
assert_eq!(1.3f128.round(), 1.0f128);
287+
assert_eq!(1.5f128.round(), 2.0f128);
288+
assert_eq!(1.7f128.round(), 2.0f128);
289+
assert_eq!(0.0f128.round(), 0.0f128);
290+
assert_eq!((-0.0f128).round(), -0.0f128);
291+
assert_eq!((-1.0f128).round(), -1.0f128);
292+
assert_eq!((-1.3f128).round(), -1.0f128);
293+
assert_eq!((-1.5f128).round(), -2.0f128);
294+
assert_eq!((-1.7f128).round(), -2.0f128);
306295
}
307296

308297
#[test]
309298
#[cfg(not(miri))]
310299
#[cfg(target_has_reliable_f128_math)]
311300
fn test_round_ties_even() {
312-
assert_approx_eq!(2.5f128.round_ties_even(), 2.0f128, TOL_PRECISE);
313-
assert_approx_eq!(1.0f128.round_ties_even(), 1.0f128, TOL_PRECISE);
314-
assert_approx_eq!(1.3f128.round_ties_even(), 1.0f128, TOL_PRECISE);
315-
assert_approx_eq!(1.5f128.round_ties_even(), 2.0f128, TOL_PRECISE);
316-
assert_approx_eq!(1.7f128.round_ties_even(), 2.0f128, TOL_PRECISE);
317-
assert_approx_eq!(0.0f128.round_ties_even(), 0.0f128, TOL_PRECISE);
318-
assert_approx_eq!((-0.0f128).round_ties_even(), -0.0f128, TOL_PRECISE);
319-
assert_approx_eq!((-1.0f128).round_ties_even(), -1.0f128, TOL_PRECISE);
320-
assert_approx_eq!((-1.3f128).round_ties_even(), -1.0f128, TOL_PRECISE);
321-
assert_approx_eq!((-1.5f128).round_ties_even(), -2.0f128, TOL_PRECISE);
322-
assert_approx_eq!((-1.7f128).round_ties_even(), -2.0f128, TOL_PRECISE);
301+
assert_eq!(2.5f128.round_ties_even(), 2.0f128);
302+
assert_eq!(1.0f128.round_ties_even(), 1.0f128);
303+
assert_eq!(1.3f128.round_ties_even(), 1.0f128);
304+
assert_eq!(1.5f128.round_ties_even(), 2.0f128);
305+
assert_eq!(1.7f128.round_ties_even(), 2.0f128);
306+
assert_eq!(0.0f128.round_ties_even(), 0.0f128);
307+
assert_eq!((-0.0f128).round_ties_even(), -0.0f128);
308+
assert_eq!((-1.0f128).round_ties_even(), -1.0f128);
309+
assert_eq!((-1.3f128).round_ties_even(), -1.0f128);
310+
assert_eq!((-1.5f128).round_ties_even(), -2.0f128);
311+
assert_eq!((-1.7f128).round_ties_even(), -2.0f128);
323312
}
324313

325314
#[test]
326315
#[cfg(not(miri))]
327316
#[cfg(target_has_reliable_f128_math)]
328317
fn test_trunc() {
329-
assert_approx_eq!(1.0f128.trunc(), 1.0f128, TOL_PRECISE);
330-
assert_approx_eq!(1.3f128.trunc(), 1.0f128, TOL_PRECISE);
331-
assert_approx_eq!(1.5f128.trunc(), 1.0f128, TOL_PRECISE);
332-
assert_approx_eq!(1.7f128.trunc(), 1.0f128, TOL_PRECISE);
333-
assert_approx_eq!(0.0f128.trunc(), 0.0f128, TOL_PRECISE);
334-
assert_approx_eq!((-0.0f128).trunc(), -0.0f128, TOL_PRECISE);
335-
assert_approx_eq!((-1.0f128).trunc(), -1.0f128, TOL_PRECISE);
336-
assert_approx_eq!((-1.3f128).trunc(), -1.0f128, TOL_PRECISE);
337-
assert_approx_eq!((-1.5f128).trunc(), -1.0f128, TOL_PRECISE);
338-
assert_approx_eq!((-1.7f128).trunc(), -1.0f128, TOL_PRECISE);
318+
assert_eq!(1.0f128.trunc(), 1.0f128);
319+
assert_eq!(1.3f128.trunc(), 1.0f128);
320+
assert_eq!(1.5f128.trunc(), 1.0f128);
321+
assert_eq!(1.7f128.trunc(), 1.0f128);
322+
assert_eq!(0.0f128.trunc(), 0.0f128);
323+
assert_eq!((-0.0f128).trunc(), -0.0f128);
324+
assert_eq!((-1.0f128).trunc(), -1.0f128);
325+
assert_eq!((-1.3f128).trunc(), -1.0f128);
326+
assert_eq!((-1.5f128).trunc(), -1.0f128);
327+
assert_eq!((-1.7f128).trunc(), -1.0f128);
339328
}
340329

341330
#[test]
342331
#[cfg(not(miri))]
343332
#[cfg(target_has_reliable_f128_math)]
344333
fn test_fract() {
345-
assert_approx_eq!(1.0f128.fract(), 0.0f128, TOL_PRECISE);
346-
assert_approx_eq!(1.3f128.fract(), 0.3f128, TOL_PRECISE);
347-
assert_approx_eq!(1.5f128.fract(), 0.5f128, TOL_PRECISE);
348-
assert_approx_eq!(1.7f128.fract(), 0.7f128, TOL_PRECISE);
349-
assert_approx_eq!(0.0f128.fract(), 0.0f128, TOL_PRECISE);
350-
assert_approx_eq!((-0.0f128).fract(), -0.0f128, TOL_PRECISE);
351-
assert_approx_eq!((-1.0f128).fract(), -0.0f128, TOL_PRECISE);
352-
assert_approx_eq!((-1.3f128).fract(), -0.3f128, TOL_PRECISE);
353-
assert_approx_eq!((-1.5f128).fract(), -0.5f128, TOL_PRECISE);
354-
assert_approx_eq!((-1.7f128).fract(), -0.7f128, TOL_PRECISE);
334+
assert_eq!(1.0f128.fract(), 0.0f128);
335+
assert_eq!(1.3f128.fract(), 0.300000000000000000000000000000000039f128);
336+
assert_eq!(1.5f128.fract(), 0.5f128);
337+
assert_eq!(1.7f128.fract(), 0.7f128);
338+
assert_eq!(0.0f128.fract(), 0.0f128);
339+
assert_eq!((-0.0f128).fract(), -0.0f128);
340+
assert_eq!((-1.0f128).fract(), -0.0f128);
341+
assert_eq!((-1.3f128).fract(), -0.300000000000000000000000000000000039f128);
342+
assert_eq!((-1.5f128).fract(), -0.5f128);
343+
assert_eq!((-1.7f128).fract(), -0.699999999999999999999999999999999961f128);
355344
}
356345

357346
#[test]
@@ -401,27 +390,27 @@ fn test_next_up() {
401390
let max_down = f128::from_bits(MAX_DOWN_BITS);
402391
let largest_subnormal = f128::from_bits(LARGEST_SUBNORMAL_BITS);
403392
let smallest_normal = f128::from_bits(SMALLEST_NORMAL_BITS);
404-
assert_f128_biteq!(f128::NEG_INFINITY.next_up(), f128::MIN);
405-
assert_f128_biteq!(f128::MIN.next_up(), -max_down);
406-
assert_f128_biteq!((-1.0 - f128::EPSILON).next_up(), -1.0);
407-
assert_f128_biteq!((-smallest_normal).next_up(), -largest_subnormal);
408-
assert_f128_biteq!((-tiny_up).next_up(), -tiny);
409-
assert_f128_biteq!((-tiny).next_up(), -0.0f128);
410-
assert_f128_biteq!((-0.0f128).next_up(), tiny);
411-
assert_f128_biteq!(0.0f128.next_up(), tiny);
412-
assert_f128_biteq!(tiny.next_up(), tiny_up);
413-
assert_f128_biteq!(largest_subnormal.next_up(), smallest_normal);
414-
assert_f128_biteq!(1.0f128.next_up(), 1.0 + f128::EPSILON);
415-
assert_f128_biteq!(f128::MAX.next_up(), f128::INFINITY);
416-
assert_f128_biteq!(f128::INFINITY.next_up(), f128::INFINITY);
393+
assert_biteq!(f128::NEG_INFINITY.next_up(), f128::MIN);
394+
assert_biteq!(f128::MIN.next_up(), -max_down);
395+
assert_biteq!((-1.0 - f128::EPSILON).next_up(), -1.0f128);
396+
assert_biteq!((-smallest_normal).next_up(), -largest_subnormal);
397+
assert_biteq!((-tiny_up).next_up(), -tiny);
398+
assert_biteq!((-tiny).next_up(), -0.0f128);
399+
assert_biteq!((-0.0f128).next_up(), tiny);
400+
assert_biteq!(0.0f128.next_up(), tiny);
401+
assert_biteq!(tiny.next_up(), tiny_up);
402+
assert_biteq!(largest_subnormal.next_up(), smallest_normal);
403+
assert_biteq!(1.0f128.next_up(), 1.0 + f128::EPSILON);
404+
assert_biteq!(f128::MAX.next_up(), f128::INFINITY);
405+
assert_biteq!(f128::INFINITY.next_up(), f128::INFINITY);
417406

418407
// Check that NaNs roundtrip.
419408
let nan0 = f128::NAN;
420409
let nan1 = f128::from_bits(f128::NAN.to_bits() ^ 0x002a_aaaa);
421410
let nan2 = f128::from_bits(f128::NAN.to_bits() ^ 0x0055_5555);
422-
assert_f128_biteq!(nan0.next_up(), nan0);
423-
assert_f128_biteq!(nan1.next_up(), nan1);
424-
assert_f128_biteq!(nan2.next_up(), nan2);
411+
assert_biteq!(nan0.next_up(), nan0);
412+
assert_biteq!(nan1.next_up(), nan1);
413+
assert_biteq!(nan2.next_up(), nan2);
425414
}
426415

427416
#[test]
@@ -431,28 +420,28 @@ fn test_next_down() {
431420
let max_down = f128::from_bits(MAX_DOWN_BITS);
432421
let largest_subnormal = f128::from_bits(LARGEST_SUBNORMAL_BITS);
433422
let smallest_normal = f128::from_bits(SMALLEST_NORMAL_BITS);
434-
assert_f128_biteq!(f128::NEG_INFINITY.next_down(), f128::NEG_INFINITY);
435-
assert_f128_biteq!(f128::MIN.next_down(), f128::NEG_INFINITY);
436-
assert_f128_biteq!((-max_down).next_down(), f128::MIN);
437-
assert_f128_biteq!((-1.0f128).next_down(), -1.0 - f128::EPSILON);
438-
assert_f128_biteq!((-largest_subnormal).next_down(), -smallest_normal);
439-
assert_f128_biteq!((-tiny).next_down(), -tiny_up);
440-
assert_f128_biteq!((-0.0f128).next_down(), -tiny);
441-
assert_f128_biteq!((0.0f128).next_down(), -tiny);
442-
assert_f128_biteq!(tiny.next_down(), 0.0f128);
443-
assert_f128_biteq!(tiny_up.next_down(), tiny);
444-
assert_f128_biteq!(smallest_normal.next_down(), largest_subnormal);
445-
assert_f128_biteq!((1.0 + f128::EPSILON).next_down(), 1.0f128);
446-
assert_f128_biteq!(f128::MAX.next_down(), max_down);
447-
assert_f128_biteq!(f128::INFINITY.next_down(), f128::MAX);
423+
assert_biteq!(f128::NEG_INFINITY.next_down(), f128::NEG_INFINITY);
424+
assert_biteq!(f128::MIN.next_down(), f128::NEG_INFINITY);
425+
assert_biteq!((-max_down).next_down(), f128::MIN);
426+
assert_biteq!((-1.0f128).next_down(), -1.0 - f128::EPSILON);
427+
assert_biteq!((-largest_subnormal).next_down(), -smallest_normal);
428+
assert_biteq!((-tiny).next_down(), -tiny_up);
429+
assert_biteq!((-0.0f128).next_down(), -tiny);
430+
assert_biteq!((0.0f128).next_down(), -tiny);
431+
assert_biteq!(tiny.next_down(), 0.0f128);
432+
assert_biteq!(tiny_up.next_down(), tiny);
433+
assert_biteq!(smallest_normal.next_down(), largest_subnormal);
434+
assert_biteq!((1.0 + f128::EPSILON).next_down(), 1.0f128);
435+
assert_biteq!(f128::MAX.next_down(), max_down);
436+
assert_biteq!(f128::INFINITY.next_down(), f128::MAX);
448437

449438
// Check that NaNs roundtrip.
450439
let nan0 = f128::NAN;
451440
let nan1 = f128::from_bits(f128::NAN.to_bits() ^ 0x002a_aaaa);
452441
let nan2 = f128::from_bits(f128::NAN.to_bits() ^ 0x0055_5555);
453-
assert_f128_biteq!(nan0.next_down(), nan0);
454-
assert_f128_biteq!(nan1.next_down(), nan1);
455-
assert_f128_biteq!(nan2.next_down(), nan2);
442+
assert_biteq!(nan0.next_down(), nan0);
443+
assert_biteq!(nan1.next_down(), nan1);
444+
assert_biteq!(nan2.next_down(), nan2);
456445
}
457446

458447
#[test]
@@ -462,10 +451,10 @@ fn test_mul_add() {
462451
let nan: f128 = f128::NAN;
463452
let inf: f128 = f128::INFINITY;
464453
let neg_inf: f128 = f128::NEG_INFINITY;
465-
assert_approx_eq!(12.3f128.mul_add(4.5, 6.7), 62.05, TOL_PRECISE);
466-
assert_approx_eq!((-12.3f128).mul_add(-4.5, -6.7), 48.65, TOL_PRECISE);
467-
assert_approx_eq!(0.0f128.mul_add(8.9, 1.2), 1.2, TOL_PRECISE);
468-
assert_approx_eq!(3.4f128.mul_add(-0.0, 5.6), 5.6, TOL_PRECISE);
454+
assert_eq!(12.3f128.mul_add(4.5, 6.7), 62.0500000000000000000000000000000037);
455+
assert_eq!((-12.3f128).mul_add(-4.5, -6.7), 48.6500000000000000000000000000000049);
456+
assert_eq!(0.0f128.mul_add(8.9, 1.2), 1.2);
457+
assert_eq!(3.4f128.mul_add(-0.0, 5.6), 5.6);
469458
assert!(nan.mul_add(7.8, 9.0).is_nan());
470459
assert_eq!(inf.mul_add(7.8, 9.0), inf);
471460
assert_eq!(neg_inf.mul_add(7.8, 9.0), neg_inf);
@@ -561,10 +550,10 @@ fn test_float_bits_conv() {
561550
assert_eq!((12.5f128).to_bits(), 0x40029000000000000000000000000000);
562551
assert_eq!((1337f128).to_bits(), 0x40094e40000000000000000000000000);
563552
assert_eq!((-14.25f128).to_bits(), 0xc002c800000000000000000000000000);
564-
assert_approx_eq!(f128::from_bits(0x3fff0000000000000000000000000000), 1.0, TOL_PRECISE);
565-
assert_approx_eq!(f128::from_bits(0x40029000000000000000000000000000), 12.5, TOL_PRECISE);
566-
assert_approx_eq!(f128::from_bits(0x40094e40000000000000000000000000), 1337.0, TOL_PRECISE);
567-
assert_approx_eq!(f128::from_bits(0xc002c800000000000000000000000000), -14.25, TOL_PRECISE);
553+
assert_eq!(f128::from_bits(0x3fff0000000000000000000000000000), 1.0);
554+
assert_eq!(f128::from_bits(0x40029000000000000000000000000000), 12.5);
555+
assert_eq!(f128::from_bits(0x40094e40000000000000000000000000), 1337.0);
556+
assert_eq!(f128::from_bits(0xc002c800000000000000000000000000), -14.25);
568557

569558
// Check that NaNs roundtrip their bits regardless of signaling-ness
570559
// 0xA is 0b1010; 0x5 is 0b0101 -- so these two together clobbers all the mantissa bits

0 commit comments

Comments
 (0)