@@ -1531,4 +1531,147 @@ mod tests {
15311531 fn test_clamp_max_is_nan ( ) {
15321532 let _ = 1.0f32 . clamp ( 3.0 , NAN ) ;
15331533 }
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+ }
15341677}
0 commit comments