@@ -631,6 +631,100 @@ TEST(APFloatTest, Maximum) {
631
631
EXPECT_TRUE (std::isnan (maximum (nan, f1).convertToDouble ()));
632
632
}
633
633
634
+ TEST (APFloatTest, MinimumNumber) {
635
+ APFloat f1 (1.0 );
636
+ APFloat f2 (2.0 );
637
+ APFloat zp (0.0 );
638
+ APFloat zn (-0.0 );
639
+ APInt intPayload_89ab (64 , 0x89ab );
640
+ APInt intPayload_cdef (64 , 0xcdef );
641
+ APFloat nan_0123[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 ),
642
+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 )};
643
+ APFloat mnan_4567[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 ),
644
+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 )};
645
+ APFloat nan_89ab[2 ] = {
646
+ APFloat::getSNaN (APFloat::IEEEdouble (), false , &intPayload_89ab),
647
+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x89ab )};
648
+ APFloat mnan_cdef[2 ] = {
649
+ APFloat::getSNaN (APFloat::IEEEdouble (), true , &intPayload_cdef),
650
+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0xcdef )};
651
+
652
+ EXPECT_TRUE (f1.bitwiseIsEqual (minimumnum (f1, f2)));
653
+ EXPECT_TRUE (f1.bitwiseIsEqual (minimumnum (f2, f1)));
654
+ EXPECT_TRUE (zn.bitwiseIsEqual (minimumnum (zp, zn)));
655
+ EXPECT_TRUE (zn.bitwiseIsEqual (minimumnum (zn, zp)));
656
+
657
+ EXPECT_TRUE (minimumnum (zn, zp).isNegative ());
658
+ EXPECT_TRUE (minimumnum (zp, zn).isNegative ());
659
+ EXPECT_TRUE (minimumnum (zn, zn).isNegative ());
660
+ EXPECT_FALSE (minimumnum (zp, zp).isNegative ());
661
+
662
+ for (APFloat n : {nan_0123[0 ], mnan_4567[0 ], nan_89ab[0 ], mnan_cdef[0 ]})
663
+ for (APFloat f : {f1, f2, zn, zp}) {
664
+ APFloat res = minimumnum (f, n);
665
+ EXPECT_FALSE (res.isNaN ());
666
+ EXPECT_TRUE (res.bitwiseIsEqual (f));
667
+ res = minimumnum (n, f);
668
+ EXPECT_FALSE (res.isNaN ());
669
+ EXPECT_TRUE (res.bitwiseIsEqual (f));
670
+ }
671
+
672
+ // When NaN vs NaN, we should keep payload/sign of either one.
673
+ for (auto n1 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef})
674
+ for (auto n2 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef}) {
675
+ APFloat res = minimumnum (n1[0 ], n2[0 ]);
676
+ EXPECT_TRUE (res.bitwiseIsEqual (n1[1 ]) || res.bitwiseIsEqual (n2[1 ]));
677
+ EXPECT_FALSE (res.isSignaling ());
678
+ }
679
+ }
680
+
681
+ TEST (APFloatTest, MaximumNumber) {
682
+ APFloat f1 (1.0 );
683
+ APFloat f2 (2.0 );
684
+ APFloat zp (0.0 );
685
+ APFloat zn (-0.0 );
686
+ APInt intPayload_89ab (64 , 0x89ab );
687
+ APInt intPayload_cdef (64 , 0xcdef );
688
+ APFloat nan_0123[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 ),
689
+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 )};
690
+ APFloat mnan_4567[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 ),
691
+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 )};
692
+ APFloat nan_89ab[2 ] = {
693
+ APFloat::getSNaN (APFloat::IEEEdouble (), false , &intPayload_89ab),
694
+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x89ab )};
695
+ APFloat mnan_cdef[2 ] = {
696
+ APFloat::getSNaN (APFloat::IEEEdouble (), true , &intPayload_cdef),
697
+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0xcdef )};
698
+
699
+ EXPECT_TRUE (f2.bitwiseIsEqual (maximumnum (f1, f2)));
700
+ EXPECT_TRUE (f2.bitwiseIsEqual (maximumnum (f2, f1)));
701
+ EXPECT_TRUE (zp.bitwiseIsEqual (maximumnum (zp, zn)));
702
+ EXPECT_TRUE (zp.bitwiseIsEqual (maximumnum (zn, zp)));
703
+
704
+ EXPECT_FALSE (maximumnum (zn, zp).isNegative ());
705
+ EXPECT_FALSE (maximumnum (zp, zn).isNegative ());
706
+ EXPECT_TRUE (maximumnum (zn, zn).isNegative ());
707
+ EXPECT_FALSE (maximumnum (zp, zp).isNegative ());
708
+
709
+ for (APFloat n : {nan_0123[0 ], mnan_4567[0 ], nan_89ab[0 ], mnan_cdef[0 ]})
710
+ for (APFloat f : {f1, f2, zn, zp}) {
711
+ APFloat res = maximumnum (f, n);
712
+ EXPECT_FALSE (res.isNaN ());
713
+ EXPECT_TRUE (res.bitwiseIsEqual (f));
714
+ res = maximumnum (n, f);
715
+ EXPECT_FALSE (res.isNaN ());
716
+ EXPECT_TRUE (res.bitwiseIsEqual (f));
717
+ }
718
+
719
+ // When NaN vs NaN, we should keep payload/sign of either one.
720
+ for (auto n1 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef})
721
+ for (auto n2 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef}) {
722
+ APFloat res = maximumnum (n1[0 ], n2[0 ]);
723
+ EXPECT_TRUE (res.bitwiseIsEqual (n1[1 ]) || res.bitwiseIsEqual (n2[1 ]));
724
+ EXPECT_FALSE (res.isSignaling ());
725
+ }
726
+ }
727
+
634
728
TEST (APFloatTest, Denormal) {
635
729
APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
636
730
0 commit comments