@@ -82,22 +82,77 @@ mod tests {
82
82
fn fmin_spec_test < F : Float > ( f : impl Fn ( F , F ) -> F ) {
83
83
let cases = [
84
84
( F :: ZERO , F :: ZERO , F :: ZERO ) ,
85
- ( F :: ONE , F :: ONE , F :: ONE ) ,
86
85
( F :: ZERO , F :: ONE , F :: ZERO ) ,
87
- ( F :: ONE , F :: ZERO , F :: ZERO ) ,
88
86
( F :: ZERO , F :: NEG_ONE , F :: NEG_ONE ) ,
87
+ ( F :: ZERO , F :: INFINITY , F :: ZERO ) ,
88
+ ( F :: ZERO , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
89
+ ( F :: ZERO , F :: NAN , F :: ZERO ) ,
90
+ ( F :: ZERO , F :: NEG_NAN , F :: ZERO ) ,
91
+ ( F :: NEG_ZERO , F :: NEG_ZERO , F :: NEG_ZERO ) ,
92
+ ( F :: NEG_ZERO , F :: ONE , F :: NEG_ZERO ) ,
93
+ ( F :: NEG_ZERO , F :: NEG_ONE , F :: NEG_ONE ) ,
94
+ ( F :: NEG_ZERO , F :: INFINITY , F :: NEG_ZERO ) ,
95
+ ( F :: NEG_ZERO , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
96
+ ( F :: NEG_ZERO , F :: NAN , F :: NEG_ZERO ) ,
97
+ ( F :: NEG_ZERO , F :: NEG_NAN , F :: NEG_ZERO ) ,
98
+ ( F :: ONE , F :: ZERO , F :: ZERO ) ,
99
+ ( F :: ONE , F :: NEG_ZERO , F :: NEG_ZERO ) ,
100
+ ( F :: ONE , F :: ONE , F :: ONE ) ,
101
+ ( F :: ONE , F :: NEG_ONE , F :: NEG_ONE ) ,
102
+ ( F :: ONE , F :: INFINITY , F :: ONE ) ,
103
+ ( F :: ONE , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
104
+ ( F :: ONE , F :: NAN , F :: ONE ) ,
105
+ ( F :: ONE , F :: NEG_NAN , F :: ONE ) ,
89
106
( F :: NEG_ONE , F :: ZERO , F :: NEG_ONE ) ,
107
+ ( F :: NEG_ONE , F :: NEG_ZERO , F :: NEG_ONE ) ,
108
+ ( F :: NEG_ONE , F :: ONE , F :: NEG_ONE ) ,
109
+ ( F :: NEG_ONE , F :: NEG_ONE , F :: NEG_ONE ) ,
110
+ ( F :: NEG_ONE , F :: INFINITY , F :: NEG_ONE ) ,
111
+ ( F :: NEG_ONE , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
112
+ ( F :: NEG_ONE , F :: NAN , F :: NEG_ONE ) ,
113
+ ( F :: NEG_ONE , F :: NEG_NAN , F :: NEG_ONE ) ,
90
114
( F :: INFINITY , F :: ZERO , F :: ZERO ) ,
115
+ ( F :: INFINITY , F :: NEG_ZERO , F :: NEG_ZERO ) ,
116
+ ( F :: INFINITY , F :: ONE , F :: ONE ) ,
117
+ ( F :: INFINITY , F :: NEG_ONE , F :: NEG_ONE ) ,
118
+ ( F :: INFINITY , F :: INFINITY , F :: INFINITY ) ,
119
+ ( F :: INFINITY , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
120
+ ( F :: INFINITY , F :: NAN , F :: INFINITY ) ,
121
+ ( F :: INFINITY , F :: NEG_NAN , F :: INFINITY ) ,
91
122
( F :: NEG_INFINITY , F :: ZERO , F :: NEG_INFINITY ) ,
123
+ ( F :: NEG_INFINITY , F :: NEG_ZERO , F :: NEG_INFINITY ) ,
124
+ ( F :: NEG_INFINITY , F :: ONE , F :: NEG_INFINITY ) ,
125
+ ( F :: NEG_INFINITY , F :: NEG_ONE , F :: NEG_INFINITY ) ,
126
+ ( F :: NEG_INFINITY , F :: INFINITY , F :: NEG_INFINITY ) ,
127
+ ( F :: NEG_INFINITY , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
128
+ ( F :: NEG_INFINITY , F :: NAN , F :: NEG_INFINITY ) ,
129
+ ( F :: NEG_INFINITY , F :: NEG_NAN , F :: NEG_INFINITY ) ,
92
130
( F :: NAN , F :: ZERO , F :: ZERO ) ,
93
- ( F :: ZERO , F :: NAN , F :: ZERO ) ,
131
+ ( F :: NAN , F :: NEG_ZERO , F :: NEG_ZERO ) ,
132
+ ( F :: NAN , F :: ONE , F :: ONE ) ,
133
+ ( F :: NAN , F :: NEG_ONE , F :: NEG_ONE ) ,
134
+ ( F :: NAN , F :: INFINITY , F :: INFINITY ) ,
135
+ ( F :: NAN , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
94
136
( F :: NAN , F :: NAN , F :: NAN ) ,
137
+ ( F :: NEG_NAN , F :: ZERO , F :: ZERO ) ,
138
+ ( F :: NEG_NAN , F :: NEG_ZERO , F :: NEG_ZERO ) ,
139
+ ( F :: NEG_NAN , F :: ONE , F :: ONE ) ,
140
+ ( F :: NEG_NAN , F :: NEG_ONE , F :: NEG_ONE ) ,
141
+ ( F :: NEG_NAN , F :: INFINITY , F :: INFINITY ) ,
142
+ ( F :: NEG_NAN , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
95
143
] ;
96
144
97
145
for ( x, y, res) in cases {
98
146
let val = f ( x, y) ;
99
147
assert_biteq ! ( val, res, "fmin({}, {})" , Hexf ( x) , Hexf ( y) ) ;
100
148
}
149
+
150
+ // Ordering between zeros and NaNs does not matter
151
+ assert_eq ! ( f( F :: ZERO , F :: NEG_ZERO ) , F :: ZERO ) ;
152
+ assert_eq ! ( f( F :: NEG_ZERO , F :: ZERO ) , F :: ZERO ) ;
153
+ assert ! ( f( F :: NAN , F :: NEG_NAN ) . is_nan( ) ) ;
154
+ assert ! ( f( F :: NEG_NAN , F :: NAN ) . is_nan( ) ) ;
155
+ assert ! ( f( F :: NEG_NAN , F :: NEG_NAN ) . is_nan( ) ) ;
101
156
}
102
157
103
158
#[ test]
@@ -125,22 +180,77 @@ mod tests {
125
180
fn fmax_spec_test < F : Float > ( f : impl Fn ( F , F ) -> F ) {
126
181
let cases = [
127
182
( F :: ZERO , F :: ZERO , F :: ZERO ) ,
128
- ( F :: ONE , F :: ONE , F :: ONE ) ,
129
183
( F :: ZERO , F :: ONE , F :: ONE ) ,
130
- ( F :: ONE , F :: ZERO , F :: ONE ) ,
131
184
( F :: ZERO , F :: NEG_ONE , F :: ZERO ) ,
185
+ ( F :: ZERO , F :: INFINITY , F :: INFINITY ) ,
186
+ ( F :: ZERO , F :: NEG_INFINITY , F :: ZERO ) ,
187
+ ( F :: ZERO , F :: NAN , F :: ZERO ) ,
188
+ ( F :: ZERO , F :: NEG_NAN , F :: ZERO ) ,
189
+ ( F :: NEG_ZERO , F :: NEG_ZERO , F :: NEG_ZERO ) ,
190
+ ( F :: NEG_ZERO , F :: ONE , F :: ONE ) ,
191
+ ( F :: NEG_ZERO , F :: NEG_ONE , F :: NEG_ZERO ) ,
192
+ ( F :: NEG_ZERO , F :: INFINITY , F :: INFINITY ) ,
193
+ ( F :: NEG_ZERO , F :: NEG_INFINITY , F :: NEG_ZERO ) ,
194
+ ( F :: NEG_ZERO , F :: NAN , F :: NEG_ZERO ) ,
195
+ ( F :: NEG_ZERO , F :: NEG_NAN , F :: NEG_ZERO ) ,
196
+ ( F :: ONE , F :: ZERO , F :: ONE ) ,
197
+ ( F :: ONE , F :: NEG_ZERO , F :: ONE ) ,
198
+ ( F :: ONE , F :: ONE , F :: ONE ) ,
199
+ ( F :: ONE , F :: NEG_ONE , F :: ONE ) ,
200
+ ( F :: ONE , F :: INFINITY , F :: INFINITY ) ,
201
+ ( F :: ONE , F :: NEG_INFINITY , F :: ONE ) ,
202
+ ( F :: ONE , F :: NAN , F :: ONE ) ,
203
+ ( F :: ONE , F :: NEG_NAN , F :: ONE ) ,
132
204
( F :: NEG_ONE , F :: ZERO , F :: ZERO ) ,
205
+ ( F :: NEG_ONE , F :: NEG_ZERO , F :: NEG_ZERO ) ,
206
+ ( F :: NEG_ONE , F :: ONE , F :: ONE ) ,
207
+ ( F :: NEG_ONE , F :: NEG_ONE , F :: NEG_ONE ) ,
208
+ ( F :: NEG_ONE , F :: INFINITY , F :: INFINITY ) ,
209
+ ( F :: NEG_ONE , F :: NEG_INFINITY , F :: NEG_ONE ) ,
210
+ ( F :: NEG_ONE , F :: NAN , F :: NEG_ONE ) ,
211
+ ( F :: NEG_ONE , F :: NEG_NAN , F :: NEG_ONE ) ,
133
212
( F :: INFINITY , F :: ZERO , F :: INFINITY ) ,
213
+ ( F :: INFINITY , F :: NEG_ZERO , F :: INFINITY ) ,
214
+ ( F :: INFINITY , F :: ONE , F :: INFINITY ) ,
215
+ ( F :: INFINITY , F :: NEG_ONE , F :: INFINITY ) ,
216
+ ( F :: INFINITY , F :: INFINITY , F :: INFINITY ) ,
217
+ ( F :: INFINITY , F :: NEG_INFINITY , F :: INFINITY ) ,
218
+ ( F :: INFINITY , F :: NAN , F :: INFINITY ) ,
219
+ ( F :: INFINITY , F :: NEG_NAN , F :: INFINITY ) ,
134
220
( F :: NEG_INFINITY , F :: ZERO , F :: ZERO ) ,
221
+ ( F :: NEG_INFINITY , F :: NEG_ZERO , F :: NEG_ZERO ) ,
222
+ ( F :: NEG_INFINITY , F :: ONE , F :: ONE ) ,
223
+ ( F :: NEG_INFINITY , F :: NEG_ONE , F :: NEG_ONE ) ,
224
+ ( F :: NEG_INFINITY , F :: INFINITY , F :: INFINITY ) ,
225
+ ( F :: NEG_INFINITY , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
226
+ ( F :: NEG_INFINITY , F :: NAN , F :: NEG_INFINITY ) ,
227
+ ( F :: NEG_INFINITY , F :: NEG_NAN , F :: NEG_INFINITY ) ,
135
228
( F :: NAN , F :: ZERO , F :: ZERO ) ,
136
- ( F :: ZERO , F :: NAN , F :: ZERO ) ,
229
+ ( F :: NAN , F :: NEG_ZERO , F :: NEG_ZERO ) ,
230
+ ( F :: NAN , F :: ONE , F :: ONE ) ,
231
+ ( F :: NAN , F :: NEG_ONE , F :: NEG_ONE ) ,
232
+ ( F :: NAN , F :: INFINITY , F :: INFINITY ) ,
233
+ ( F :: NAN , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
137
234
( F :: NAN , F :: NAN , F :: NAN ) ,
235
+ ( F :: NEG_NAN , F :: ZERO , F :: ZERO ) ,
236
+ ( F :: NEG_NAN , F :: NEG_ZERO , F :: NEG_ZERO ) ,
237
+ ( F :: NEG_NAN , F :: ONE , F :: ONE ) ,
238
+ ( F :: NEG_NAN , F :: NEG_ONE , F :: NEG_ONE ) ,
239
+ ( F :: NEG_NAN , F :: INFINITY , F :: INFINITY ) ,
240
+ ( F :: NEG_NAN , F :: NEG_INFINITY , F :: NEG_INFINITY ) ,
138
241
] ;
139
242
140
243
for ( x, y, res) in cases {
141
244
let val = f ( x, y) ;
142
245
assert_biteq ! ( val, res, "fmax({}, {})" , Hexf ( x) , Hexf ( y) ) ;
143
246
}
247
+
248
+ // Ordering between zeros and NaNs does not matter
249
+ assert_eq ! ( f( F :: ZERO , F :: NEG_ZERO ) , F :: ZERO ) ;
250
+ assert_eq ! ( f( F :: NEG_ZERO , F :: ZERO ) , F :: ZERO ) ;
251
+ assert ! ( f( F :: NAN , F :: NEG_NAN ) . is_nan( ) ) ;
252
+ assert ! ( f( F :: NEG_NAN , F :: NAN ) . is_nan( ) ) ;
253
+ assert ! ( f( F :: NEG_NAN , F :: NEG_NAN ) . is_nan( ) ) ;
144
254
}
145
255
146
256
#[ test]
0 commit comments