@@ -415,44 +415,109 @@ class MathTest {
415
415
@ Test def rintForDouble (): Unit = {
416
416
import Math .rint
417
417
418
- def isPosZero (x : Double ): Boolean =
419
- x == 0.0 && (1.0 / x) == Double .PositiveInfinity
420
-
421
- def isNegZero (x : Double ): Boolean =
422
- x == 0.0 && (1.0 / x) == Double .NegativeInfinity
418
+ val intLimit = (1L << 52 ).toDouble
419
+ val halfIntLimit = (1L << 51 ).toDouble
420
+ val doubleIntLimit = (1L << 53 ).toDouble
423
421
424
422
// Specials
425
- assertTrue(isPosZero( rint(+ 0.0 ) ))
426
- assertTrue(isNegZero( rint(- 0.0 ) ))
427
- assertEquals (Double .PositiveInfinity , rint(Double .PositiveInfinity ), 0.0 )
428
- assertEquals (Double .NegativeInfinity , rint(Double .NegativeInfinity ), 0.0 )
429
- assertTrue( rint(Double .NaN ).isNaN )
423
+ assertSameDouble( + 0.0 , rint(+ 0.0 ))
424
+ assertSameDouble( - 0.0 , rint(- 0.0 ))
425
+ assertSameDouble (Double .PositiveInfinity , rint(Double .PositiveInfinity ))
426
+ assertSameDouble (Double .NegativeInfinity , rint(Double .NegativeInfinity ))
427
+ assertSameDouble( Double . NaN , rint(Double .NaN ))
430
428
431
429
// Positive values
432
- assertTrue(isPosZero(rint(0.1 )))
433
- assertTrue(isPosZero(rint(0.5 )))
434
- assertEquals(1.0 , rint(0.5000000000000001 ), 0.0 )
435
- assertEquals(1.0 , rint(0.999 ), 0.0 )
436
- assertEquals(1.0 , rint(1.4999999999999998 ), 0.0 )
437
- assertEquals(2.0 , rint(1.5 ), 0.0 )
438
- assertEquals(2.0 , rint(2.0 ), 0.0 )
439
- assertEquals(2.0 , rint(2.1 ), 0.0 )
440
- assertEquals(2.0 , rint(2.5 ), 0.0 )
441
- assertEquals(Double .MaxValue , rint(Double .MaxValue ), 0.0 )
442
- assertEquals(4503599627370496.0 , rint(4503599627370495.5 ), 0.0 ) // MaxSafeInt / 2
430
+ assertSameDouble(+ 0.0 , rint(Double .MinPositiveValue ))
431
+ assertSameDouble(+ 0.0 , rint(java.lang.Double .MIN_NORMAL ))
432
+ assertSameDouble(+ 0.0 , rint(0.1 ))
433
+ assertSameDouble(+ 0.0 , rint(0.5 ))
434
+ assertSameDouble(1.0 , rint(0.5000000000000001 ))
435
+ assertSameDouble(1.0 , rint(0.999 ))
436
+ assertSameDouble(1.0 , rint(1.4999999999999998 ))
437
+ assertSameDouble(2.0 , rint(1.5 ))
438
+ assertSameDouble(2.0 , rint(2.0 ))
439
+ assertSameDouble(2.0 , rint(2.1 ))
440
+ assertSameDouble(2.0 , rint(2.5 ))
441
+ assertSameDouble(3.0 , rint(2.75 ))
442
+ assertSameDouble(3.0 , rint(3.25 ))
443
+ assertSameDouble(4.0 , rint(3.5 ))
444
+ assertSameDouble(4.0 , rint(3.75 ))
445
+ assertSameDouble(halfIntLimit - 2.0 , rint(halfIntLimit - 1.5 ))
446
+ assertSameDouble(halfIntLimit - 1.0 , rint(halfIntLimit - 1.25 ))
447
+ assertSameDouble(halfIntLimit - 1.0 , rint(halfIntLimit - 1.0 ))
448
+ assertSameDouble(halfIntLimit - 1.0 , rint(halfIntLimit - 0.75 ))
449
+ assertSameDouble(halfIntLimit, rint(halfIntLimit - 0.5 ))
450
+ assertSameDouble(halfIntLimit, rint(halfIntLimit - 0.25 ))
451
+ assertSameDouble(halfIntLimit, rint(halfIntLimit))
452
+ assertSameDouble(halfIntLimit, rint(halfIntLimit + 0.25 ))
453
+ assertSameDouble(halfIntLimit, rint(halfIntLimit + 0.5 ))
454
+ assertSameDouble(halfIntLimit + 1.0 , rint(halfIntLimit + 0.75 ))
455
+ assertSameDouble(halfIntLimit + 1.0 , rint(halfIntLimit + 1.0 ))
456
+ assertSameDouble(halfIntLimit + 1.0 , rint(halfIntLimit + 1.25 ))
457
+ assertSameDouble(halfIntLimit + 2.0 , rint(halfIntLimit + 1.5 ))
458
+ assertSameDouble(intLimit - 2.0 , rint(intLimit - 1.5 ))
459
+ assertSameDouble(intLimit - 1.0 , rint(intLimit - 1.0 ))
460
+ assertSameDouble(intLimit, rint(intLimit - 0.5 ))
461
+ assertSameDouble(intLimit, rint(intLimit))
462
+
463
+ val largeIntegers = List (
464
+ // corner cases just above intLimit
465
+ intLimit + 1.0 ,
466
+ intLimit + 2.0 ,
467
+ intLimit + 3.0 ,
468
+ intLimit + 4.0 ,
469
+ // corner cases around doubleIntLimit
470
+ doubleIntLimit - 4.0 ,
471
+ doubleIntLimit - 3.0 ,
472
+ doubleIntLimit - 2.0 ,
473
+ doubleIntLimit - 1.0 ,
474
+ doubleIntLimit,
475
+ doubleIntLimit + 2.0 ,
476
+ doubleIntLimit + 4.0 ,
477
+ doubleIntLimit + 6.0 ,
478
+ doubleIntLimit + 8.0 ,
479
+ doubleIntLimit + 16.0 ,
480
+ Double .MaxValue
481
+ )
482
+ for (x <- largeIntegers)
483
+ assertSameDouble(x, rint(x))
443
484
444
485
// Negative values
445
- assertTrue(isNegZero(rint(- 0.1 )))
446
- assertTrue(isNegZero(rint(- 0.5 )))
447
- assertEquals(- 1.0 , rint(- 0.5000000000000001 ), 0.0 )
448
- assertEquals(- 1.0 , rint(- 0.999 ), 0.0 )
449
- assertEquals(- 1.0 , rint(- 1.4999999999999998 ), 0.0 )
450
- assertEquals(- 2.0 , rint(- 1.5 ), 0.0 )
451
- assertEquals(- 2.0 , rint(- 2.0 ), 0.0 )
452
- assertEquals(- 2.0 , rint(- 2.1 ), 0.0 )
453
- assertEquals(- 2.0 , rint(- 2.5 ), 0.0 )
454
- assertEquals(Double .MinValue , rint(Double .MinValue ), 0.0 )
455
- assertEquals(- 4503599627370496.0 , rint(- 4503599627370495.5 ), 0.0 ) // -MaxSafeInt / 2
486
+ assertSameDouble(- 0.0 , rint(- Double .MinPositiveValue ))
487
+ assertSameDouble(- 0.0 , rint(- java.lang.Double .MIN_NORMAL ))
488
+ assertSameDouble(- 0.0 , rint(- 0.1 ))
489
+ assertSameDouble(- 0.0 , rint(- 0.5 ))
490
+ assertSameDouble(- 1.0 , rint(- 0.5000000000000001 ))
491
+ assertSameDouble(- 1.0 , rint(- 0.999 ))
492
+ assertSameDouble(- 1.0 , rint(- 1.4999999999999998 ))
493
+ assertSameDouble(- 2.0 , rint(- 1.5 ))
494
+ assertSameDouble(- 2.0 , rint(- 2.0 ))
495
+ assertSameDouble(- 2.0 , rint(- 2.1 ))
496
+ assertSameDouble(- 2.0 , rint(- 2.5 ))
497
+ assertSameDouble(- 3.0 , rint(- 2.75 ))
498
+ assertSameDouble(- 3.0 , rint(- 3.25 ))
499
+ assertSameDouble(- 4.0 , rint(- 3.5 ))
500
+ assertSameDouble(- 4.0 , rint(- 3.75 ))
501
+ assertSameDouble(- (halfIntLimit - 2.0 ), rint(- (halfIntLimit - 1.5 )))
502
+ assertSameDouble(- (halfIntLimit - 1.0 ), rint(- (halfIntLimit - 1.25 )))
503
+ assertSameDouble(- (halfIntLimit - 1.0 ), rint(- (halfIntLimit - 1.0 )))
504
+ assertSameDouble(- (halfIntLimit - 1.0 ), rint(- (halfIntLimit - 0.75 )))
505
+ assertSameDouble(- halfIntLimit, rint(- (halfIntLimit - 0.5 )))
506
+ assertSameDouble(- halfIntLimit, rint(- (halfIntLimit - 0.25 )))
507
+ assertSameDouble(- halfIntLimit, rint(- halfIntLimit))
508
+ assertSameDouble(- halfIntLimit, rint(- (halfIntLimit + 0.25 )))
509
+ assertSameDouble(- halfIntLimit, rint(- (halfIntLimit + 0.5 )))
510
+ assertSameDouble(- (halfIntLimit + 1.0 ), rint(- (halfIntLimit + 0.75 )))
511
+ assertSameDouble(- (halfIntLimit + 1.0 ), rint(- (halfIntLimit + 1.0 )))
512
+ assertSameDouble(- (halfIntLimit + 1.0 ), rint(- (halfIntLimit + 1.25 )))
513
+ assertSameDouble(- (halfIntLimit + 2.0 ), rint(- (halfIntLimit + 1.5 )))
514
+ assertSameDouble(- (intLimit - 2.0 ), rint(- (intLimit - 1.5 )))
515
+ assertSameDouble(- (intLimit - 1.0 ), rint(- (intLimit - 1.0 )))
516
+ assertSameDouble(- intLimit, rint(- (intLimit - 0.5 )))
517
+ assertSameDouble(- intLimit, rint(- intLimit))
518
+
519
+ for (x <- largeIntegers)
520
+ assertSameDouble(- x, rint(- x))
456
521
}
457
522
458
523
@ Test def addExact (): Unit = {
0 commit comments