@@ -289,79 +289,79 @@ fn test_is_sign_negative() {
289
289
assert!((-f64::NAN).is_sign_negative());
290
290
}
291
291
292
+ macro_rules! assert_f64_biteq {
293
+ ($left : expr, $right : expr) => {
294
+ let l: &f64 = &$left;
295
+ let r: &f64 = &$right;
296
+ let lb = l.to_bits();
297
+ let rb = r.to_bits();
298
+ assert_eq!(lb, rb, "float {} ({:#x}) is not equal to {} ({:#x})", *l, lb, *r, rb);
299
+ }
300
+ }
301
+
302
+ // Ignore test on x87 floating point, these platforms do not guarantee NaN
303
+ // payloads are preserved and flush denormals to zero, failing the tests.
304
+ #[cfg(not(target_arch = "x86"))]
292
305
#[test]
293
306
fn test_next_up() {
294
307
let tiny = f64::from_bits(1);
295
308
let tiny_up = f64::from_bits(2);
296
309
let max_down = f64::from_bits(0x7fef_ffff_ffff_fffe);
297
310
let largest_subnormal = f64::from_bits(0x000f_ffff_ffff_ffff);
298
311
let smallest_normal = f64::from_bits(0x0010_0000_0000_0000);
299
-
300
- // Check that NaNs roundtrip.
301
- // Ignore test on x87 floating point, the code is still correct but these
302
- // platforms do not guarantee NaN payloads are preserved, which caused these
303
- // tests to fail.
304
- #[cfg(not(all(target_arch = "x86", not(target_feature = "fxsr"))))]
305
- {
306
- let nan0 = f64::NAN;
307
- let nan1 = f64::from_bits(f64::NAN.to_bits() ^ 0x000a_aaaa_aaaa_aaaa);
308
- let nan2 = f64::from_bits(f64::NAN.to_bits() ^ 0x0005_5555_5555_5555);
309
- assert_eq!(nan0.next_up().to_bits(), nan0.to_bits());
310
- assert_eq!(nan1.next_up().to_bits(), nan1.to_bits());
311
- assert_eq!(nan2.next_up().to_bits(), nan2.to_bits());
312
- }
313
-
314
- assert_eq!(f64::NEG_INFINITY.next_up(), f64::MIN);
315
- assert_eq!(f64::MIN.next_up(), -max_down);
316
- assert_eq!((-1.0 - f64::EPSILON).next_up(), -1.0);
317
- assert_eq!((-smallest_normal).next_up(), -largest_subnormal);
318
- assert_eq!((-tiny_up).next_up(), -tiny);
319
- assert_eq!((-tiny).next_up().to_bits(), (-0.0f64).to_bits());
320
- assert_eq!((-0.0f64).next_up(), tiny);
321
- assert_eq!(0.0f64.next_up(), tiny);
322
- assert_eq!(tiny.next_up(), tiny_up);
323
- assert_eq!(largest_subnormal.next_up(), smallest_normal);
324
- assert_eq!(1.0f64.next_up(), 1.0 + f64::EPSILON);
325
- assert_eq!(f64::MAX.next_up(), f64::INFINITY);
326
- assert_eq!(f64::INFINITY.next_up(), f64::INFINITY);
327
- }
328
-
312
+ assert_f64_biteq!(f64::NEG_INFINITY.next_up(), f64::MIN);
313
+ assert_f64_biteq!(f64::MIN.next_up(), -max_down);
314
+ assert_f64_biteq!((-1.0 - f64::EPSILON).next_up(), -1.0);
315
+ assert_f64_biteq!((-smallest_normal).next_up(), -largest_subnormal);
316
+ assert_f64_biteq!((-tiny_up).next_up(), -tiny);
317
+ assert_f64_biteq!((-tiny).next_up(), -0.0f64);
318
+ assert_f64_biteq!((-0.0f64).next_up(), tiny);
319
+ assert_f64_biteq!(0.0f64.next_up(), tiny);
320
+ assert_f64_biteq!(tiny.next_up(), tiny_up);
321
+ assert_f64_biteq!(largest_subnormal.next_up(), smallest_normal);
322
+ assert_f64_biteq!(1.0f64.next_up(), 1.0 + f64::EPSILON);
323
+ assert_f64_biteq!(f64::MAX.next_up(), f64::INFINITY);
324
+ assert_f64_biteq!(f64::INFINITY.next_up(), f64::INFINITY);
325
+
326
+ let nan0 = f64::NAN;
327
+ let nan1 = f64::from_bits(f64::NAN.to_bits() ^ 0x000a_aaaa_aaaa_aaaa);
328
+ let nan2 = f64::from_bits(f64::NAN.to_bits() ^ 0x0005_5555_5555_5555);
329
+ assert_f64_biteq!(nan0.next_up(), nan0);
330
+ assert_f64_biteq!(nan1.next_up(), nan1);
331
+ assert_f64_biteq!(nan2.next_up(), nan2);
332
+ }
333
+
334
+ // Ignore test on x87 floating point, these platforms do not guarantee NaN
335
+ // payloads are preserved and flush denormals to zero, failing the tests.
336
+ #[cfg(not(target_arch = "x86"))]
329
337
#[test]
330
338
fn test_next_down() {
331
339
let tiny = f64::from_bits(1);
332
340
let tiny_up = f64::from_bits(2);
333
341
let max_down = f64::from_bits(0x7fef_ffff_ffff_fffe);
334
342
let largest_subnormal = f64::from_bits(0x000f_ffff_ffff_ffff);
335
343
let smallest_normal = f64::from_bits(0x0010_0000_0000_0000);
336
-
337
- // Check that NaNs roundtrip.
338
- // Ignore test on x87 floating point, the code is still correct but these
339
- // platforms do not guarantee NaN payloads are preserved, which caused these
340
- // tests to fail.
341
- #[cfg(not(all(target_arch = "x86", not(target_feature = "fxsr"))))]
342
- {
343
- let nan0 = f64::NAN;
344
- let nan1 = f64::from_bits(f64::NAN.to_bits() ^ 0x000a_aaaa_aaaa_aaaa);
345
- let nan2 = f64::from_bits(f64::NAN.to_bits() ^ 0x0005_5555_5555_5555);
346
- assert_eq!(nan0.next_down().to_bits(), nan0.to_bits());
347
- assert_eq!(nan1.next_down().to_bits(), nan1.to_bits());
348
- assert_eq!(nan2.next_down().to_bits(), nan2.to_bits());
349
- }
350
-
351
- assert_eq!(f64::NEG_INFINITY.next_down(), f64::NEG_INFINITY);
352
- assert_eq!(f64::MIN.next_down(), f64::NEG_INFINITY);
353
- assert_eq!((-max_down).next_down(), f64::MIN);
354
- assert_eq!((-1.0f64).next_down(), -1.0 - f64::EPSILON);
355
- assert_eq!((-largest_subnormal).next_down(), -smallest_normal);
356
- assert_eq!((-tiny).next_down(), -tiny_up);
357
- assert_eq!((-0.0f64).next_down(), -tiny);
358
- assert_eq!((0.0f64).next_down(), -tiny);
359
- assert_eq!(tiny.next_down().to_bits(), 0.0f64.to_bits());
360
- assert_eq!(tiny_up.next_down(), tiny);
361
- assert_eq!(smallest_normal.next_down(), largest_subnormal);
362
- assert_eq!((1.0 + f64::EPSILON).next_down(), 1.0f64);
363
- assert_eq!(f64::MAX.next_down(), max_down);
364
- assert_eq!(f64::INFINITY.next_down(), f64::MAX);
344
+ assert_f64_biteq!(f64::NEG_INFINITY.next_down(), f64::NEG_INFINITY);
345
+ assert_f64_biteq!(f64::MIN.next_down(), f64::NEG_INFINITY);
346
+ assert_f64_biteq!((-max_down).next_down(), f64::MIN);
347
+ assert_f64_biteq!((-1.0f64).next_down(), -1.0 - f64::EPSILON);
348
+ assert_f64_biteq!((-largest_subnormal).next_down(), -smallest_normal);
349
+ assert_f64_biteq!((-tiny).next_down(), -tiny_up);
350
+ assert_f64_biteq!((-0.0f64).next_down(), -tiny);
351
+ assert_f64_biteq!((0.0f64).next_down(), -tiny);
352
+ assert_f64_biteq!(tiny.next_down(), 0.0f64);
353
+ assert_f64_biteq!(tiny_up.next_down(), tiny);
354
+ assert_f64_biteq!(smallest_normal.next_down(), largest_subnormal);
355
+ assert_f64_biteq!((1.0 + f64::EPSILON).next_down(), 1.0f64);
356
+ assert_f64_biteq!(f64::MAX.next_down(), max_down);
357
+ assert_f64_biteq!(f64::INFINITY.next_down(), f64::MAX);
358
+
359
+ let nan0 = f64::NAN;
360
+ let nan1 = f64::from_bits(f64::NAN.to_bits() ^ 0x000a_aaaa_aaaa_aaaa);
361
+ let nan2 = f64::from_bits(f64::NAN.to_bits() ^ 0x0005_5555_5555_5555);
362
+ assert_f64_biteq!(nan0.next_down(), nan0);
363
+ assert_f64_biteq!(nan1.next_down(), nan1);
364
+ assert_f64_biteq!(nan2.next_down(), nan2);
365
365
}
366
366
367
367
#[test]
0 commit comments