@@ -47,14 +47,26 @@ union ieee754dp ieee754dp_fmin(union ieee754dp x, union ieee754dp y)
4747 case CLPAIR (IEEE754_CLASS_SNAN , IEEE754_CLASS_INF ):
4848 return ieee754dp_nanxcpt (x );
4949
50- /* numbers are preferred to NaNs */
50+ /*
51+ * Quiet NaN handling
52+ */
53+
54+ /*
55+ * The case of both inputs quiet NaNs
56+ */
57+ case CLPAIR (IEEE754_CLASS_QNAN , IEEE754_CLASS_QNAN ):
58+ return x ;
59+
60+ /*
61+ * The cases of exactly one input quiet NaN (numbers
62+ * are here preferred as returned values to NaNs)
63+ */
5164 case CLPAIR (IEEE754_CLASS_ZERO , IEEE754_CLASS_QNAN ):
5265 case CLPAIR (IEEE754_CLASS_NORM , IEEE754_CLASS_QNAN ):
5366 case CLPAIR (IEEE754_CLASS_DNORM , IEEE754_CLASS_QNAN ):
5467 case CLPAIR (IEEE754_CLASS_INF , IEEE754_CLASS_QNAN ):
5568 return x ;
5669
57- case CLPAIR (IEEE754_CLASS_QNAN , IEEE754_CLASS_QNAN ):
5870 case CLPAIR (IEEE754_CLASS_QNAN , IEEE754_CLASS_ZERO ):
5971 case CLPAIR (IEEE754_CLASS_QNAN , IEEE754_CLASS_NORM ):
6072 case CLPAIR (IEEE754_CLASS_QNAN , IEEE754_CLASS_DNORM ):
@@ -80,9 +92,7 @@ union ieee754dp ieee754dp_fmin(union ieee754dp x, union ieee754dp y)
8092 return ys ? y : x ;
8193
8294 case CLPAIR (IEEE754_CLASS_ZERO , IEEE754_CLASS_ZERO ):
83- if (xs == ys )
84- return x ;
85- return ieee754dp_zero (1 );
95+ return ieee754dp_zero (xs | ys );
8696
8797 case CLPAIR (IEEE754_CLASS_DNORM , IEEE754_CLASS_DNORM ):
8898 DPDNORMX ;
@@ -106,16 +116,32 @@ union ieee754dp ieee754dp_fmin(union ieee754dp x, union ieee754dp y)
106116 else if (xs < ys )
107117 return y ;
108118
109- /* Compare exponent */
110- if (xe > ye )
111- return y ;
112- else if (xe < ye )
113- return x ;
119+ /* Signs of inputs are the same, let's compare exponents */
120+ if (xs == 0 ) {
121+ /* Inputs are both positive */
122+ if (xe > ye )
123+ return y ;
124+ else if (xe < ye )
125+ return x ;
126+ } else {
127+ /* Inputs are both negative */
128+ if (xe > ye )
129+ return x ;
130+ else if (xe < ye )
131+ return y ;
132+ }
114133
115- /* Compare mantissa */
134+ /* Signs and exponents of inputs are equal, let's compare mantissas */
135+ if (xs == 0 ) {
136+ /* Inputs are both positive, with equal signs and exponents */
137+ if (xm <= ym )
138+ return x ;
139+ return y ;
140+ }
141+ /* Inputs are both negative, with equal signs and exponents */
116142 if (xm <= ym )
117- return x ;
118- return y ;
143+ return y ;
144+ return x ;
119145}
120146
121147union ieee754dp ieee754dp_fmina (union ieee754dp x , union ieee754dp y )
@@ -147,14 +173,26 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
147173 case CLPAIR (IEEE754_CLASS_SNAN , IEEE754_CLASS_INF ):
148174 return ieee754dp_nanxcpt (x );
149175
150- /* numbers are preferred to NaNs */
176+ /*
177+ * Quiet NaN handling
178+ */
179+
180+ /*
181+ * The case of both inputs quiet NaNs
182+ */
183+ case CLPAIR (IEEE754_CLASS_QNAN , IEEE754_CLASS_QNAN ):
184+ return x ;
185+
186+ /*
187+ * The cases of exactly one input quiet NaN (numbers
188+ * are here preferred as returned values to NaNs)
189+ */
151190 case CLPAIR (IEEE754_CLASS_ZERO , IEEE754_CLASS_QNAN ):
152191 case CLPAIR (IEEE754_CLASS_NORM , IEEE754_CLASS_QNAN ):
153192 case CLPAIR (IEEE754_CLASS_DNORM , IEEE754_CLASS_QNAN ):
154193 case CLPAIR (IEEE754_CLASS_INF , IEEE754_CLASS_QNAN ):
155194 return x ;
156195
157- case CLPAIR (IEEE754_CLASS_QNAN , IEEE754_CLASS_QNAN ):
158196 case CLPAIR (IEEE754_CLASS_QNAN , IEEE754_CLASS_ZERO ):
159197 case CLPAIR (IEEE754_CLASS_QNAN , IEEE754_CLASS_NORM ):
160198 case CLPAIR (IEEE754_CLASS_QNAN , IEEE754_CLASS_DNORM ):
@@ -164,25 +202,25 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
164202 /*
165203 * Infinity and zero handling
166204 */
205+ case CLPAIR (IEEE754_CLASS_INF , IEEE754_CLASS_INF ):
206+ return ieee754dp_inf (xs | ys );
207+
167208 case CLPAIR (IEEE754_CLASS_INF , IEEE754_CLASS_ZERO ):
168209 case CLPAIR (IEEE754_CLASS_INF , IEEE754_CLASS_NORM ):
169210 case CLPAIR (IEEE754_CLASS_INF , IEEE754_CLASS_DNORM ):
170211 case CLPAIR (IEEE754_CLASS_NORM , IEEE754_CLASS_ZERO ):
171212 case CLPAIR (IEEE754_CLASS_DNORM , IEEE754_CLASS_ZERO ):
172- return x ;
213+ return y ;
173214
174- case CLPAIR (IEEE754_CLASS_INF , IEEE754_CLASS_INF ):
175215 case CLPAIR (IEEE754_CLASS_NORM , IEEE754_CLASS_INF ):
176216 case CLPAIR (IEEE754_CLASS_DNORM , IEEE754_CLASS_INF ):
177217 case CLPAIR (IEEE754_CLASS_ZERO , IEEE754_CLASS_INF ):
178218 case CLPAIR (IEEE754_CLASS_ZERO , IEEE754_CLASS_NORM ):
179219 case CLPAIR (IEEE754_CLASS_ZERO , IEEE754_CLASS_DNORM ):
180- return y ;
220+ return x ;
181221
182222 case CLPAIR (IEEE754_CLASS_ZERO , IEEE754_CLASS_ZERO ):
183- if (xs == ys )
184- return x ;
185- return ieee754dp_zero (1 );
223+ return ieee754dp_zero (xs | ys );
186224
187225 case CLPAIR (IEEE754_CLASS_DNORM , IEEE754_CLASS_DNORM ):
188226 DPDNORMX ;
@@ -207,7 +245,11 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
207245 return x ;
208246
209247 /* Compare mantissa */
210- if (xm <= ym )
248+ if (xm < ym )
249+ return x ;
250+ else if (xm > ym )
251+ return y ;
252+ else if (xs == 1 )
211253 return x ;
212254 return y ;
213255}
0 commit comments