Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion library/core/src/num/f128.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1196,7 +1196,8 @@ impl f128 {
#[inline]
#[must_use]
#[unstable(feature = "f128", issue = "116909")]
pub fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
pub const fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
let mut left = self.to_bits() as i128;
let mut right = other.to_bits() as i128;

Expand Down
3 changes: 2 additions & 1 deletion library/core/src/num/f16.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1175,7 +1175,8 @@ impl f16 {
#[inline]
#[must_use]
#[unstable(feature = "f16", issue = "116909")]
pub fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
pub const fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
let mut left = self.to_bits() as i16;
let mut right = other.to_bits() as i16;

Expand Down
3 changes: 2 additions & 1 deletion library/core/src/num/f32.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1353,9 +1353,10 @@ impl f32 {
/// }
/// ```
#[stable(feature = "total_cmp", since = "1.62.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
#[must_use]
#[inline]
pub fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
pub const fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
let mut left = self.to_bits() as i32;
let mut right = other.to_bits() as i32;

Expand Down
3 changes: 2 additions & 1 deletion library/core/src/num/f64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1351,9 +1351,10 @@ impl f64 {
/// }
/// ```
#[stable(feature = "total_cmp", since = "1.62.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
#[must_use]
#[inline]
pub fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
pub const fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
let mut left = self.to_bits() as i64;
let mut right = other.to_bits() as i64;

Expand Down
171 changes: 85 additions & 86 deletions library/coretests/tests/floats/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1246,104 +1246,103 @@ float_test! {
float_test! {
name: total_cmp,
attrs: {
const: #[cfg(false)],
f16: #[cfg(all(not(miri), target_has_reliable_f16_math))],
f128: #[cfg(all(not(miri), target_has_reliable_f128_math))],
},
test<Float> {
use core::cmp::Ordering;

fn quiet_bit_mask() -> <Float as TestableFloat>::Int {
const fn quiet_bit_mask() -> <Float as TestableFloat>::Int {
1 << (Float::MANTISSA_DIGITS - 2)
}

fn q_nan() -> Float {
const fn q_nan() -> Float {
Float::from_bits(Float::NAN.to_bits() | quiet_bit_mask())
}

assert_eq!(Ordering::Equal, Float::total_cmp(&-q_nan(), &-q_nan()));
assert_eq!(Ordering::Equal, Float::total_cmp(&-Float::INFINITY, &-Float::INFINITY));
assert_eq!(Ordering::Equal, Float::total_cmp(&-Float::MAX, &-Float::MAX));
assert_eq!(Ordering::Equal, Float::total_cmp(&-2.5, &-2.5));
assert_eq!(Ordering::Equal, Float::total_cmp(&-1.0, &-1.0));
assert_eq!(Ordering::Equal, Float::total_cmp(&-1.5, &-1.5));
assert_eq!(Ordering::Equal, Float::total_cmp(&-0.5, &-0.5));
assert_eq!(Ordering::Equal, Float::total_cmp(&-Float::MIN_POSITIVE, &-Float::MIN_POSITIVE));
assert_eq!(Ordering::Equal, Float::total_cmp(&-Float::MAX_SUBNORMAL, &-Float::MAX_SUBNORMAL));
assert_eq!(Ordering::Equal, Float::total_cmp(&-Float::TINY, &-Float::TINY));
assert_eq!(Ordering::Equal, Float::total_cmp(&-0.0, &-0.0));
assert_eq!(Ordering::Equal, Float::total_cmp(&0.0, &0.0));
assert_eq!(Ordering::Equal, Float::total_cmp(&Float::TINY, &Float::TINY));
assert_eq!(Ordering::Equal, Float::total_cmp(&Float::MAX_SUBNORMAL, &Float::MAX_SUBNORMAL));
assert_eq!(Ordering::Equal, Float::total_cmp(&Float::MIN_POSITIVE, &Float::MIN_POSITIVE));
assert_eq!(Ordering::Equal, Float::total_cmp(&0.5, &0.5));
assert_eq!(Ordering::Equal, Float::total_cmp(&1.0, &1.0));
assert_eq!(Ordering::Equal, Float::total_cmp(&1.5, &1.5));
assert_eq!(Ordering::Equal, Float::total_cmp(&2.5, &2.5));
assert_eq!(Ordering::Equal, Float::total_cmp(&Float::MAX, &Float::MAX));
assert_eq!(Ordering::Equal, Float::total_cmp(&Float::INFINITY, &Float::INFINITY));
assert_eq!(Ordering::Equal, Float::total_cmp(&q_nan(), &q_nan()));

assert_eq!(Ordering::Less, Float::total_cmp(&-Float::INFINITY, &-Float::MAX));
assert_eq!(Ordering::Less, Float::total_cmp(&-Float::MAX, &-2.5));
assert_eq!(Ordering::Less, Float::total_cmp(&-2.5, &-1.5));
assert_eq!(Ordering::Less, Float::total_cmp(&-1.5, &-1.0));
assert_eq!(Ordering::Less, Float::total_cmp(&-1.0, &-0.5));
assert_eq!(Ordering::Less, Float::total_cmp(&-0.5, &-Float::MIN_POSITIVE));
assert_eq!(Ordering::Less, Float::total_cmp(&-Float::MIN_POSITIVE, &-Float::MAX_SUBNORMAL));
assert_eq!(Ordering::Less, Float::total_cmp(&-Float::MAX_SUBNORMAL, &-Float::TINY));
assert_eq!(Ordering::Less, Float::total_cmp(&-Float::TINY, &-0.0));
assert_eq!(Ordering::Less, Float::total_cmp(&-0.0, &0.0));
assert_eq!(Ordering::Less, Float::total_cmp(&0.0, &Float::TINY));
assert_eq!(Ordering::Less, Float::total_cmp(&Float::TINY, &Float::MAX_SUBNORMAL));
assert_eq!(Ordering::Less, Float::total_cmp(&Float::MAX_SUBNORMAL, &Float::MIN_POSITIVE));
assert_eq!(Ordering::Less, Float::total_cmp(&Float::MIN_POSITIVE, &0.5));
assert_eq!(Ordering::Less, Float::total_cmp(&0.5, &1.0));
assert_eq!(Ordering::Less, Float::total_cmp(&1.0, &1.5));
assert_eq!(Ordering::Less, Float::total_cmp(&1.5, &2.5));
assert_eq!(Ordering::Less, Float::total_cmp(&2.5, &Float::MAX));
assert_eq!(Ordering::Less, Float::total_cmp(&Float::MAX, &Float::INFINITY));

assert_eq!(Ordering::Greater, Float::total_cmp(&-Float::MAX, &-Float::INFINITY));
assert_eq!(Ordering::Greater, Float::total_cmp(&-2.5, &-Float::MAX));
assert_eq!(Ordering::Greater, Float::total_cmp(&-1.5, &-2.5));
assert_eq!(Ordering::Greater, Float::total_cmp(&-1.0, &-1.5));
assert_eq!(Ordering::Greater, Float::total_cmp(&-0.5, &-1.0));
assert_eq!(Ordering::Greater, Float::total_cmp(&-Float::MIN_POSITIVE, &-0.5));
assert_eq!(Ordering::Greater, Float::total_cmp(&-Float::MAX_SUBNORMAL, &-Float::MIN_POSITIVE));
assert_eq!(Ordering::Greater, Float::total_cmp(&-Float::TINY, &-Float::MAX_SUBNORMAL));
assert_eq!(Ordering::Greater, Float::total_cmp(&-0.0, &-Float::TINY));
assert_eq!(Ordering::Greater, Float::total_cmp(&0.0, &-0.0));
assert_eq!(Ordering::Greater, Float::total_cmp(&Float::TINY, &0.0));
assert_eq!(Ordering::Greater, Float::total_cmp(&Float::MAX_SUBNORMAL, &Float::TINY));
assert_eq!(Ordering::Greater, Float::total_cmp(&Float::MIN_POSITIVE, &Float::MAX_SUBNORMAL));
assert_eq!(Ordering::Greater, Float::total_cmp(&0.5, &Float::MIN_POSITIVE));
assert_eq!(Ordering::Greater, Float::total_cmp(&1.0, &0.5));
assert_eq!(Ordering::Greater, Float::total_cmp(&1.5, &1.0));
assert_eq!(Ordering::Greater, Float::total_cmp(&2.5, &1.5));
assert_eq!(Ordering::Greater, Float::total_cmp(&Float::MAX, &2.5));
assert_eq!(Ordering::Greater, Float::total_cmp(&Float::INFINITY, &Float::MAX));

assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &-Float::INFINITY));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &-Float::MAX));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &-2.5));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &-1.5));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &-1.0));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &-0.5));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &-Float::MIN_POSITIVE));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &-Float::MAX_SUBNORMAL));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &-Float::TINY));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &-0.0));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &0.0));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &Float::TINY));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &Float::MAX_SUBNORMAL));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &Float::MIN_POSITIVE));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &0.5));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &1.0));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &1.5));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &2.5));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &Float::MAX));
assert_eq!(Ordering::Less, Float::total_cmp(&-q_nan(), &Float::INFINITY));
assert!(matches!(Float::total_cmp(&-q_nan(), &-q_nan()), Ordering::Equal));
assert!(matches!(Float::total_cmp(&-Float::INFINITY, &-Float::INFINITY), Ordering::Equal));
assert!(matches!(Float::total_cmp(&-Float::MAX, &-Float::MAX), Ordering::Equal));
assert!(matches!(Float::total_cmp(&-2.5, &-2.5), Ordering::Equal));
assert!(matches!(Float::total_cmp(&-1.0, &-1.0), Ordering::Equal));
assert!(matches!(Float::total_cmp(&-1.5, &-1.5), Ordering::Equal));
assert!(matches!(Float::total_cmp(&-0.5, &-0.5), Ordering::Equal));
assert!(matches!(Float::total_cmp(&-Float::MIN_POSITIVE, &-Float::MIN_POSITIVE), Ordering::Equal));
assert!(matches!(Float::total_cmp(&-Float::MAX_SUBNORMAL, &-Float::MAX_SUBNORMAL), Ordering::Equal));
assert!(matches!(Float::total_cmp(&-Float::TINY, &-Float::TINY), Ordering::Equal));
assert!(matches!(Float::total_cmp(&-0.0, &-0.0), Ordering::Equal));
assert!(matches!(Float::total_cmp(&0.0, &0.0), Ordering::Equal));
assert!(matches!(Float::total_cmp(&Float::TINY, &Float::TINY), Ordering::Equal));
assert!(matches!(Float::total_cmp(&Float::MAX_SUBNORMAL, &Float::MAX_SUBNORMAL), Ordering::Equal));
assert!(matches!(Float::total_cmp(&Float::MIN_POSITIVE, &Float::MIN_POSITIVE), Ordering::Equal));
assert!(matches!(Float::total_cmp(&0.5, &0.5), Ordering::Equal));
assert!(matches!(Float::total_cmp(&1.0, &1.0), Ordering::Equal));
assert!(matches!(Float::total_cmp(&1.5, &1.5), Ordering::Equal));
assert!(matches!(Float::total_cmp(&2.5, &2.5), Ordering::Equal));
assert!(matches!(Float::total_cmp(&Float::MAX, &Float::MAX), Ordering::Equal));
assert!(matches!(Float::total_cmp(&Float::INFINITY, &Float::INFINITY), Ordering::Equal));
assert!(matches!(Float::total_cmp(&q_nan(), &q_nan()), Ordering::Equal));

assert!(matches!(Float::total_cmp(&-Float::INFINITY, &-Float::MAX), Ordering::Less));
assert!(matches!(Float::total_cmp(&-Float::MAX, &-2.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&-2.5, &-1.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&-1.5, &-1.0), Ordering::Less));
assert!(matches!(Float::total_cmp(&-1.0, &-0.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&-0.5, &-Float::MIN_POSITIVE), Ordering::Less));
assert!(matches!(Float::total_cmp(&-Float::MIN_POSITIVE, &-Float::MAX_SUBNORMAL), Ordering::Less));
assert!(matches!(Float::total_cmp(&-Float::MAX_SUBNORMAL, &-Float::TINY), Ordering::Less));
assert!(matches!(Float::total_cmp(&-Float::TINY, &-0.0), Ordering::Less));
assert!(matches!(Float::total_cmp(&-0.0, &0.0), Ordering::Less));
assert!(matches!(Float::total_cmp(&0.0, &Float::TINY), Ordering::Less));
assert!(matches!(Float::total_cmp(&Float::TINY, &Float::MAX_SUBNORMAL), Ordering::Less));
assert!(matches!(Float::total_cmp(&Float::MAX_SUBNORMAL, &Float::MIN_POSITIVE), Ordering::Less));
assert!(matches!(Float::total_cmp(&Float::MIN_POSITIVE, &0.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&0.5, &1.0), Ordering::Less));
assert!(matches!(Float::total_cmp(&1.0, &1.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&1.5, &2.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&2.5, &Float::MAX), Ordering::Less));
assert!(matches!(Float::total_cmp(&Float::MAX, &Float::INFINITY), Ordering::Less));

assert!(matches!(Float::total_cmp(&-Float::MAX, &-Float::INFINITY), Ordering::Greater));
assert!(matches!(Float::total_cmp(&-2.5, &-Float::MAX), Ordering::Greater));
assert!(matches!(Float::total_cmp(&-1.5, &-2.5), Ordering::Greater));
assert!(matches!(Float::total_cmp(&-1.0, &-1.5), Ordering::Greater));
assert!(matches!(Float::total_cmp(&-0.5, &-1.0), Ordering::Greater));
assert!(matches!(Float::total_cmp(&-Float::MIN_POSITIVE, &-0.5), Ordering::Greater));
assert!(matches!(Float::total_cmp(&-Float::MAX_SUBNORMAL, &-Float::MIN_POSITIVE), Ordering::Greater));
assert!(matches!(Float::total_cmp(&-Float::TINY, &-Float::MAX_SUBNORMAL), Ordering::Greater));
assert!(matches!(Float::total_cmp(&-0.0, &-Float::TINY), Ordering::Greater));
assert!(matches!(Float::total_cmp(&0.0, &-0.0), Ordering::Greater));
assert!(matches!(Float::total_cmp(&Float::TINY, &0.0), Ordering::Greater));
assert!(matches!(Float::total_cmp(&Float::MAX_SUBNORMAL, &Float::TINY), Ordering::Greater));
assert!(matches!(Float::total_cmp(&Float::MIN_POSITIVE, &Float::MAX_SUBNORMAL), Ordering::Greater));
assert!(matches!(Float::total_cmp(&0.5, &Float::MIN_POSITIVE), Ordering::Greater));
assert!(matches!(Float::total_cmp(&1.0, &0.5), Ordering::Greater));
assert!(matches!(Float::total_cmp(&1.5, &1.0), Ordering::Greater));
assert!(matches!(Float::total_cmp(&2.5, &1.5), Ordering::Greater));
assert!(matches!(Float::total_cmp(&Float::MAX, &2.5), Ordering::Greater));
assert!(matches!(Float::total_cmp(&Float::INFINITY, &Float::MAX), Ordering::Greater));

assert!(matches!(Float::total_cmp(&-q_nan(), &-Float::INFINITY), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &-Float::MAX), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &-2.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &-1.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &-1.0), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &-0.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &-Float::MIN_POSITIVE), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &-Float::MAX_SUBNORMAL), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &-Float::TINY), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &-0.0), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &0.0), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &Float::TINY), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &Float::MAX_SUBNORMAL), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &Float::MIN_POSITIVE), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &0.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &1.0), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &1.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &2.5), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &Float::MAX), Ordering::Less));
assert!(matches!(Float::total_cmp(&-q_nan(), &Float::INFINITY), Ordering::Less));

}
}
Expand Down
Loading