@@ -1531,4 +1531,147 @@ mod tests {
1531
1531
fn test_clamp_max_is_nan ( ) {
1532
1532
let _ = 1.0f32 . clamp ( 3.0 , NAN ) ;
1533
1533
}
1534
+
1535
+ #[ test]
1536
+ fn test_total_cmp ( ) {
1537
+ use core:: cmp:: Ordering ;
1538
+
1539
+ fn quiet_bit_mask ( ) -> u32 {
1540
+ 1 << ( f32:: MANTISSA_DIGITS - 2 )
1541
+ }
1542
+
1543
+ fn min_subnorm ( ) -> f32 {
1544
+ f32:: MIN_POSITIVE / f32:: powf ( 2.0 , f32:: MANTISSA_DIGITS as f32 - 1.0 )
1545
+ }
1546
+
1547
+ fn max_subnorm ( ) -> f32 {
1548
+ f32:: MIN_POSITIVE - min_subnorm ( )
1549
+ }
1550
+
1551
+ fn q_nan ( ) -> f32 {
1552
+ f32:: from_bits ( f32:: NAN . to_bits ( ) | quiet_bit_mask ( ) )
1553
+ }
1554
+
1555
+ fn s_nan ( ) -> f32 {
1556
+ f32:: from_bits ( ( f32:: NAN . to_bits ( ) & !quiet_bit_mask ( ) ) + 42 )
1557
+ }
1558
+
1559
+ assert_eq ! ( Ordering :: Equal , ( -q_nan( ) ) . total_cmp( & -q_nan( ) ) ) ;
1560
+ assert_eq ! ( Ordering :: Equal , ( -s_nan( ) ) . total_cmp( & -s_nan( ) ) ) ;
1561
+ assert_eq ! ( Ordering :: Equal , ( -f32 :: INFINITY ) . total_cmp( & -f32 :: INFINITY ) ) ;
1562
+ assert_eq ! ( Ordering :: Equal , ( -f32 :: MAX ) . total_cmp( & -f32 :: MAX ) ) ;
1563
+ assert_eq ! ( Ordering :: Equal , ( -2.5_f32 ) . total_cmp( & -2.5 ) ) ;
1564
+ assert_eq ! ( Ordering :: Equal , ( -1.0_f32 ) . total_cmp( & -1.0 ) ) ;
1565
+ assert_eq ! ( Ordering :: Equal , ( -1.5_f32 ) . total_cmp( & -1.5 ) ) ;
1566
+ assert_eq ! ( Ordering :: Equal , ( -0.5_f32 ) . total_cmp( & -0.5 ) ) ;
1567
+ assert_eq ! ( Ordering :: Equal , ( -f32 :: MIN_POSITIVE ) . total_cmp( & -f32 :: MIN_POSITIVE ) ) ;
1568
+ assert_eq ! ( Ordering :: Equal , ( -max_subnorm( ) ) . total_cmp( & -max_subnorm( ) ) ) ;
1569
+ assert_eq ! ( Ordering :: Equal , ( -min_subnorm( ) ) . total_cmp( & -min_subnorm( ) ) ) ;
1570
+ assert_eq ! ( Ordering :: Equal , ( -0.0_f32 ) . total_cmp( & -0.0 ) ) ;
1571
+ assert_eq ! ( Ordering :: Equal , 0.0_f32 . total_cmp( & 0.0 ) ) ;
1572
+ assert_eq ! ( Ordering :: Equal , min_subnorm( ) . total_cmp( & min_subnorm( ) ) ) ;
1573
+ assert_eq ! ( Ordering :: Equal , max_subnorm( ) . total_cmp( & max_subnorm( ) ) ) ;
1574
+ assert_eq ! ( Ordering :: Equal , f32 :: MIN_POSITIVE . total_cmp( & f32 :: MIN_POSITIVE ) ) ;
1575
+ assert_eq ! ( Ordering :: Equal , 0.5_f32 . total_cmp( & 0.5 ) ) ;
1576
+ assert_eq ! ( Ordering :: Equal , 1.0_f32 . total_cmp( & 1.0 ) ) ;
1577
+ assert_eq ! ( Ordering :: Equal , 1.5_f32 . total_cmp( & 1.5 ) ) ;
1578
+ assert_eq ! ( Ordering :: Equal , 2.5_f32 . total_cmp( & 2.5 ) ) ;
1579
+ assert_eq ! ( Ordering :: Equal , f32 :: MAX . total_cmp( & f32 :: MAX ) ) ;
1580
+ assert_eq ! ( Ordering :: Equal , f32 :: INFINITY . total_cmp( & f32 :: INFINITY ) ) ;
1581
+ assert_eq ! ( Ordering :: Equal , s_nan( ) . total_cmp( & s_nan( ) ) ) ;
1582
+ assert_eq ! ( Ordering :: Equal , q_nan( ) . total_cmp( & q_nan( ) ) ) ;
1583
+
1584
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -s_nan( ) ) ) ;
1585
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -f32 :: INFINITY ) ) ;
1586
+ assert_eq ! ( Ordering :: Less , ( -f32 :: INFINITY ) . total_cmp( & -f32 :: MAX ) ) ;
1587
+ assert_eq ! ( Ordering :: Less , ( -f32 :: MAX ) . total_cmp( & -2.5 ) ) ;
1588
+ assert_eq ! ( Ordering :: Less , ( -2.5_f32 ) . total_cmp( & -1.5 ) ) ;
1589
+ assert_eq ! ( Ordering :: Less , ( -1.5_f32 ) . total_cmp( & -1.0 ) ) ;
1590
+ assert_eq ! ( Ordering :: Less , ( -1.0_f32 ) . total_cmp( & -0.5 ) ) ;
1591
+ assert_eq ! ( Ordering :: Less , ( -0.5_f32 ) . total_cmp( & -f32 :: MIN_POSITIVE ) ) ;
1592
+ assert_eq ! ( Ordering :: Less , ( -f32 :: MIN_POSITIVE ) . total_cmp( & -max_subnorm( ) ) ) ;
1593
+ assert_eq ! ( Ordering :: Less , ( -max_subnorm( ) ) . total_cmp( & -min_subnorm( ) ) ) ;
1594
+ assert_eq ! ( Ordering :: Less , ( -min_subnorm( ) ) . total_cmp( & -0.0 ) ) ;
1595
+ assert_eq ! ( Ordering :: Less , ( -0.0_f32 ) . total_cmp( & 0.0 ) ) ;
1596
+ assert_eq ! ( Ordering :: Less , 0.0_f32 . total_cmp( & min_subnorm( ) ) ) ;
1597
+ assert_eq ! ( Ordering :: Less , min_subnorm( ) . total_cmp( & max_subnorm( ) ) ) ;
1598
+ assert_eq ! ( Ordering :: Less , max_subnorm( ) . total_cmp( & f32 :: MIN_POSITIVE ) ) ;
1599
+ assert_eq ! ( Ordering :: Less , f32 :: MIN_POSITIVE . total_cmp( & 0.5 ) ) ;
1600
+ assert_eq ! ( Ordering :: Less , 0.5_f32 . total_cmp( & 1.0 ) ) ;
1601
+ assert_eq ! ( Ordering :: Less , 1.0_f32 . total_cmp( & 1.5 ) ) ;
1602
+ assert_eq ! ( Ordering :: Less , 1.5_f32 . total_cmp( & 2.5 ) ) ;
1603
+ assert_eq ! ( Ordering :: Less , 2.5_f32 . total_cmp( & f32 :: MAX ) ) ;
1604
+ assert_eq ! ( Ordering :: Less , f32 :: MAX . total_cmp( & f32 :: INFINITY ) ) ;
1605
+ assert_eq ! ( Ordering :: Less , f32 :: INFINITY . total_cmp( & s_nan( ) ) ) ;
1606
+ assert_eq ! ( Ordering :: Less , s_nan( ) . total_cmp( & q_nan( ) ) ) ;
1607
+
1608
+ assert_eq ! ( Ordering :: Greater , ( -s_nan( ) ) . total_cmp( & -q_nan( ) ) ) ;
1609
+ assert_eq ! ( Ordering :: Greater , ( -f32 :: INFINITY ) . total_cmp( & -s_nan( ) ) ) ;
1610
+ assert_eq ! ( Ordering :: Greater , ( -f32 :: MAX ) . total_cmp( & -f32 :: INFINITY ) ) ;
1611
+ assert_eq ! ( Ordering :: Greater , ( -2.5_f32 ) . total_cmp( & -f32 :: MAX ) ) ;
1612
+ assert_eq ! ( Ordering :: Greater , ( -1.5_f32 ) . total_cmp( & -2.5 ) ) ;
1613
+ assert_eq ! ( Ordering :: Greater , ( -1.0_f32 ) . total_cmp( & -1.5 ) ) ;
1614
+ assert_eq ! ( Ordering :: Greater , ( -0.5_f32 ) . total_cmp( & -1.0 ) ) ;
1615
+ assert_eq ! ( Ordering :: Greater , ( -f32 :: MIN_POSITIVE ) . total_cmp( & -0.5 ) ) ;
1616
+ assert_eq ! ( Ordering :: Greater , ( -max_subnorm( ) ) . total_cmp( & -f32 :: MIN_POSITIVE ) ) ;
1617
+ assert_eq ! ( Ordering :: Greater , ( -min_subnorm( ) ) . total_cmp( & -max_subnorm( ) ) ) ;
1618
+ assert_eq ! ( Ordering :: Greater , ( -0.0_f32 ) . total_cmp( & -min_subnorm( ) ) ) ;
1619
+ assert_eq ! ( Ordering :: Greater , 0.0_f32 . total_cmp( & -0.0 ) ) ;
1620
+ assert_eq ! ( Ordering :: Greater , min_subnorm( ) . total_cmp( & 0.0 ) ) ;
1621
+ assert_eq ! ( Ordering :: Greater , max_subnorm( ) . total_cmp( & min_subnorm( ) ) ) ;
1622
+ assert_eq ! ( Ordering :: Greater , f32 :: MIN_POSITIVE . total_cmp( & max_subnorm( ) ) ) ;
1623
+ assert_eq ! ( Ordering :: Greater , 0.5_f32 . total_cmp( & f32 :: MIN_POSITIVE ) ) ;
1624
+ assert_eq ! ( Ordering :: Greater , 1.0_f32 . total_cmp( & 0.5 ) ) ;
1625
+ assert_eq ! ( Ordering :: Greater , 1.5_f32 . total_cmp( & 1.0 ) ) ;
1626
+ assert_eq ! ( Ordering :: Greater , 2.5_f32 . total_cmp( & 1.5 ) ) ;
1627
+ assert_eq ! ( Ordering :: Greater , f32 :: MAX . total_cmp( & 2.5 ) ) ;
1628
+ assert_eq ! ( Ordering :: Greater , f32 :: INFINITY . total_cmp( & f32 :: MAX ) ) ;
1629
+ assert_eq ! ( Ordering :: Greater , s_nan( ) . total_cmp( & f32 :: INFINITY ) ) ;
1630
+ assert_eq ! ( Ordering :: Greater , q_nan( ) . total_cmp( & s_nan( ) ) ) ;
1631
+
1632
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -s_nan( ) ) ) ;
1633
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -f32 :: INFINITY ) ) ;
1634
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -f32 :: MAX ) ) ;
1635
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -2.5 ) ) ;
1636
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -1.5 ) ) ;
1637
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -1.0 ) ) ;
1638
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -0.5 ) ) ;
1639
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -f32 :: MIN_POSITIVE ) ) ;
1640
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -max_subnorm( ) ) ) ;
1641
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -min_subnorm( ) ) ) ;
1642
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & -0.0 ) ) ;
1643
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & 0.0 ) ) ;
1644
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & min_subnorm( ) ) ) ;
1645
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & max_subnorm( ) ) ) ;
1646
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & f32 :: MIN_POSITIVE ) ) ;
1647
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & 0.5 ) ) ;
1648
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & 1.0 ) ) ;
1649
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & 1.5 ) ) ;
1650
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & 2.5 ) ) ;
1651
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & f32 :: MAX ) ) ;
1652
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & f32 :: INFINITY ) ) ;
1653
+ assert_eq ! ( Ordering :: Less , ( -q_nan( ) ) . total_cmp( & s_nan( ) ) ) ;
1654
+
1655
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -f32 :: INFINITY ) ) ;
1656
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -f32 :: MAX ) ) ;
1657
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -2.5 ) ) ;
1658
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -1.5 ) ) ;
1659
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -1.0 ) ) ;
1660
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -0.5 ) ) ;
1661
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -f32 :: MIN_POSITIVE ) ) ;
1662
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -max_subnorm( ) ) ) ;
1663
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -min_subnorm( ) ) ) ;
1664
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & -0.0 ) ) ;
1665
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & 0.0 ) ) ;
1666
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & min_subnorm( ) ) ) ;
1667
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & max_subnorm( ) ) ) ;
1668
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & f32 :: MIN_POSITIVE ) ) ;
1669
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & 0.5 ) ) ;
1670
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & 1.0 ) ) ;
1671
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & 1.5 ) ) ;
1672
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & 2.5 ) ) ;
1673
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & f32 :: MAX ) ) ;
1674
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & f32 :: INFINITY ) ) ;
1675
+ assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & s_nan( ) ) ) ;
1676
+ }
1534
1677
}
0 commit comments