@@ -82,22 +82,77 @@ mod tests {
8282 fn fmin_spec_test < F : Float > ( f : impl Fn ( F , F ) -> F ) {
8383 let cases = [
8484 ( F :: ZERO , F :: ZERO , F :: ZERO ) ,
85- ( F :: ONE , F :: ONE , F :: ONE ) ,
8685 ( F :: ZERO , F :: ONE , F :: ZERO ) ,
87- ( F :: ONE , F :: ZERO , F :: ZERO ) ,
8886 ( 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 ) ,
89106 ( 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 ) ,
90114 ( 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 ) ,
91122 ( 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 ) ,
92130 ( 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 ) ,
94136 ( 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 ) ,
95143 ] ;
96144
97145 for ( x, y, res) in cases {
98146 let val = f ( x, y) ;
99147 assert_biteq ! ( val, res, "fmin({}, {})" , Hexf ( x) , Hexf ( y) ) ;
100148 }
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( ) ) ;
101156 }
102157
103158 #[ test]
@@ -125,22 +180,77 @@ mod tests {
125180 fn fmax_spec_test < F : Float > ( f : impl Fn ( F , F ) -> F ) {
126181 let cases = [
127182 ( F :: ZERO , F :: ZERO , F :: ZERO ) ,
128- ( F :: ONE , F :: ONE , F :: ONE ) ,
129183 ( F :: ZERO , F :: ONE , F :: ONE ) ,
130- ( F :: ONE , F :: ZERO , F :: ONE ) ,
131184 ( 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 ) ,
132204 ( 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 ) ,
133212 ( 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 ) ,
134220 ( 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 ) ,
135228 ( 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 ) ,
137234 ( 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 ) ,
138241 ] ;
139242
140243 for ( x, y, res) in cases {
141244 let val = f ( x, y) ;
142245 assert_biteq ! ( val, res, "fmax({}, {})" , Hexf ( x) , Hexf ( y) ) ;
143246 }
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( ) ) ;
144254 }
145255
146256 #[ test]
0 commit comments