1
+ //@ run-pass
2
+
3
+ #![ feature( const_cmp, f16, f128) ]
4
+
5
+ use std:: cmp:: Ordering ;
6
+
7
+ fn main ( ) {
8
+ // Test f32::total_cmp in const context
9
+ const F32_EQUAL : Ordering = ( 1.0_f32 ) . total_cmp ( & 1.0_f32 ) ;
10
+ assert_eq ! ( F32_EQUAL , Ordering :: Equal ) ;
11
+
12
+ const F32_LESS : Ordering = ( 1.0_f32 ) . total_cmp ( & 2.0_f32 ) ;
13
+ assert_eq ! ( F32_LESS , Ordering :: Less ) ;
14
+
15
+ const F32_GREATER : Ordering = ( 2.0_f32 ) . total_cmp ( & 1.0_f32 ) ;
16
+ assert_eq ! ( F32_GREATER , Ordering :: Greater ) ;
17
+
18
+ // Test special values for f32
19
+ const F32_NEG_ZERO_VS_POS_ZERO : Ordering = ( -0.0_f32 ) . total_cmp ( & 0.0_f32 ) ;
20
+ assert_eq ! ( F32_NEG_ZERO_VS_POS_ZERO , Ordering :: Less ) ;
21
+
22
+ const F32_NAN_VS_FINITE : Ordering = f32:: NAN . total_cmp ( & 1.0_f32 ) ;
23
+ assert_eq ! ( F32_NAN_VS_FINITE , Ordering :: Greater ) ;
24
+
25
+ const F32_INFINITY_VS_FINITE : Ordering = f32:: INFINITY . total_cmp ( & 1.0_f32 ) ;
26
+ assert_eq ! ( F32_INFINITY_VS_FINITE , Ordering :: Greater ) ;
27
+
28
+ const F32_NEG_INFINITY_VS_FINITE : Ordering = f32:: NEG_INFINITY . total_cmp ( & 1.0_f32 ) ;
29
+ assert_eq ! ( F32_NEG_INFINITY_VS_FINITE , Ordering :: Less ) ;
30
+
31
+ // Test f64::total_cmp in const context
32
+ const F64_EQUAL : Ordering = ( 1.0_f64 ) . total_cmp ( & 1.0_f64 ) ;
33
+ assert_eq ! ( F64_EQUAL , Ordering :: Equal ) ;
34
+
35
+ const F64_LESS : Ordering = ( 1.0_f64 ) . total_cmp ( & 2.0_f64 ) ;
36
+ assert_eq ! ( F64_LESS , Ordering :: Less ) ;
37
+
38
+ const F64_GREATER : Ordering = ( 2.0_f64 ) . total_cmp ( & 1.0_f64 ) ;
39
+ assert_eq ! ( F64_GREATER , Ordering :: Greater ) ;
40
+
41
+ // Test special values for f64
42
+ const F64_NEG_ZERO_VS_POS_ZERO : Ordering = ( -0.0_f64 ) . total_cmp ( & 0.0_f64 ) ;
43
+ assert_eq ! ( F64_NEG_ZERO_VS_POS_ZERO , Ordering :: Less ) ;
44
+
45
+ const F64_NAN_VS_FINITE : Ordering = f64:: NAN . total_cmp ( & 1.0_f64 ) ;
46
+ assert_eq ! ( F64_NAN_VS_FINITE , Ordering :: Greater ) ;
47
+
48
+ const F64_INFINITY_VS_FINITE : Ordering = f64:: INFINITY . total_cmp ( & 1.0_f64 ) ;
49
+ assert_eq ! ( F64_INFINITY_VS_FINITE , Ordering :: Greater ) ;
50
+
51
+ const F64_NEG_INFINITY_VS_FINITE : Ordering = f64:: NEG_INFINITY . total_cmp ( & 1.0_f64 ) ;
52
+ assert_eq ! ( F64_NEG_INFINITY_VS_FINITE , Ordering :: Less ) ;
53
+
54
+ // Test edge cases: comparing NaNs with each other
55
+ const F32_NAN_VS_NAN : Ordering = f32:: NAN . total_cmp ( & f32:: NAN ) ;
56
+ assert_eq ! ( F32_NAN_VS_NAN , Ordering :: Equal ) ;
57
+
58
+ const F64_NAN_VS_NAN : Ordering = f64:: NAN . total_cmp ( & f64:: NAN ) ;
59
+ assert_eq ! ( F64_NAN_VS_NAN , Ordering :: Equal ) ;
60
+
61
+ // Test subnormal numbers
62
+ const F32_SUBNORMAL_CMP : Ordering = f32:: MIN_POSITIVE . total_cmp ( & ( f32:: MIN_POSITIVE / 2.0 ) ) ;
63
+ assert_eq ! ( F32_SUBNORMAL_CMP , Ordering :: Greater ) ;
64
+
65
+ const F64_SUBNORMAL_CMP : Ordering = f64:: MIN_POSITIVE . total_cmp ( & ( f64:: MIN_POSITIVE / 2.0 ) ) ;
66
+ assert_eq ! ( F64_SUBNORMAL_CMP , Ordering :: Greater ) ;
67
+
68
+ // Test f16::total_cmp in const context
69
+ const F16_EQUAL : Ordering = ( 1.0_f16 ) . total_cmp ( & 1.0_f16 ) ;
70
+ assert_eq ! ( F16_EQUAL , Ordering :: Equal ) ;
71
+
72
+ const F16_LESS : Ordering = ( 1.0_f16 ) . total_cmp ( & 2.0_f16 ) ;
73
+ assert_eq ! ( F16_LESS , Ordering :: Less ) ;
74
+
75
+ const F16_GREATER : Ordering = ( 2.0_f16 ) . total_cmp ( & 1.0_f16 ) ;
76
+ assert_eq ! ( F16_GREATER , Ordering :: Greater ) ;
77
+
78
+ // Test special values for f16
79
+ const F16_NEG_ZERO_VS_POS_ZERO : Ordering = ( -0.0_f16 ) . total_cmp ( & 0.0_f16 ) ;
80
+ assert_eq ! ( F16_NEG_ZERO_VS_POS_ZERO , Ordering :: Less ) ;
81
+
82
+ const F16_NAN_VS_FINITE : Ordering = f16:: NAN . total_cmp ( & 1.0_f16 ) ;
83
+ assert_eq ! ( F16_NAN_VS_FINITE , Ordering :: Greater ) ;
84
+
85
+ const F16_INFINITY_VS_FINITE : Ordering = f16:: INFINITY . total_cmp ( & 1.0_f16 ) ;
86
+ assert_eq ! ( F16_INFINITY_VS_FINITE , Ordering :: Greater ) ;
87
+
88
+ const F16_NAN_VS_NAN : Ordering = f16:: NAN . total_cmp ( & f16:: NAN ) ;
89
+ assert_eq ! ( F16_NAN_VS_NAN , Ordering :: Equal ) ;
90
+
91
+ // Test f128::total_cmp in const context
92
+ const F128_EQUAL : Ordering = ( 1.0_f128 ) . total_cmp ( & 1.0_f128 ) ;
93
+ assert_eq ! ( F128_EQUAL , Ordering :: Equal ) ;
94
+
95
+ const F128_LESS : Ordering = ( 1.0_f128 ) . total_cmp ( & 2.0_f128 ) ;
96
+ assert_eq ! ( F128_LESS , Ordering :: Less ) ;
97
+
98
+ const F128_GREATER : Ordering = ( 2.0_f128 ) . total_cmp ( & 1.0_f128 ) ;
99
+ assert_eq ! ( F128_GREATER , Ordering :: Greater ) ;
100
+
101
+ // Test special values for f128
102
+ const F128_NEG_ZERO_VS_POS_ZERO : Ordering = ( -0.0_f128 ) . total_cmp ( & 0.0_f128 ) ;
103
+ assert_eq ! ( F128_NEG_ZERO_VS_POS_ZERO , Ordering :: Less ) ;
104
+
105
+ const F128_NAN_VS_FINITE : Ordering = f128:: NAN . total_cmp ( & 1.0_f128 ) ;
106
+ assert_eq ! ( F128_NAN_VS_FINITE , Ordering :: Greater ) ;
107
+
108
+ const F128_INFINITY_VS_FINITE : Ordering = f128:: INFINITY . total_cmp ( & 1.0_f128 ) ;
109
+ assert_eq ! ( F128_INFINITY_VS_FINITE , Ordering :: Greater ) ;
110
+
111
+ const F128_NAN_VS_NAN : Ordering = f128:: NAN . total_cmp ( & f128:: NAN ) ;
112
+ assert_eq ! ( F128_NAN_VS_NAN , Ordering :: Equal ) ;
113
+ }
0 commit comments