@@ -130,8 +130,8 @@ macro_rules! add {
130
130
// If partial cancellation occured, we need to left-shift the result
131
131
// and adjust the exponent:
132
132
if a_significand < implicit_bit << 3 {
133
- let shift = ( a_significand. 0 . leading_zeros( )
134
- - ( implicit_bit << 3 ) . 0 . leading_zeros( ) ) as i32 ;
133
+ let shift = a_significand. 0 . leading_zeros( ) as i32
134
+ - ( implicit_bit << 3 ) . 0 . leading_zeros( ) as i32 ;
135
135
a_significand <<= shift as usize ;
136
136
a_exponent -= Wrapping ( shift) ;
137
137
}
@@ -205,15 +205,33 @@ mod test {
205
205
// TODO: Add F32/F64 to qc so that they print the right values (at the very least)
206
206
quickcheck ! {
207
207
fn addsf3( a: U32 , b: U32 ) -> bool {
208
- let ( a, b) = ( a. 0 , b. 0 ) ;
209
- let r = super :: __addsf3( f32 :: from_repr( a) , f32 :: from_repr( b) ) ;
210
- r. repr( ) == ( f32 :: from_repr( a) + f32 :: from_repr( b) ) . repr( )
208
+ let ( a, b) = ( f32 :: from_repr( a. 0 ) , f32 :: from_repr( b. 0 ) ) ;
209
+ let x = super :: __addsf3( a, b) ;
210
+ let y = a + b;
211
+ if x. is_nan( ) == y. is_nan( ) {
212
+ if x. is_nan( ) {
213
+ true
214
+ } else {
215
+ x. repr( ) == y. repr( )
216
+ }
217
+ } else {
218
+ false
219
+ }
211
220
}
212
221
213
222
fn adddf3( a: U64 , b: U64 ) -> bool {
214
- let ( a, b) = ( a. 0 , b. 0 ) ;
215
- let r = super :: __adddf3( f64 :: from_repr( a) , f64 :: from_repr( b) ) ;
216
- r. repr( ) == ( f64 :: from_repr( a) + f64 :: from_repr( b) ) . repr( )
223
+ let ( a, b) = ( f64 :: from_repr( a. 0 ) , f64 :: from_repr( b. 0 ) ) ;
224
+ let x = super :: __adddf3( a, b) ;
225
+ let y = a + b;
226
+ if x. is_nan( ) == y. is_nan( ) {
227
+ if x. is_nan( ) {
228
+ true
229
+ } else {
230
+ x. repr( ) == y. repr( )
231
+ }
232
+ } else {
233
+ false
234
+ }
217
235
}
218
236
}
219
237
@@ -262,19 +280,26 @@ mod test {
262
280
}
263
281
264
282
#[ test]
265
- fn test_float_tiny_plus_large ( ) {
283
+ fn test_float_different_nan ( ) {
266
284
let a = f32:: from_repr ( 1 ) ;
267
- let b = f32:: from_repr ( 4286990935 ) ;
268
- let r = super :: __addsf3 ( a, b) ;
269
- assert_eq ! ( r. repr( ) , ( a + b) . repr( ) ) ;
285
+ let b = f32:: from_repr ( 0b11111111100100010001001010101010 ) ;
286
+ let x = super :: __addsf3 ( a, b) ;
287
+ let y = a + b;
288
+ if !( x. is_nan ( ) && y. is_nan ( ) ) {
289
+ assert_eq ! ( x. repr( ) , ( a + b) . repr( ) ) ;
290
+ }
270
291
}
271
292
272
293
#[ test]
273
- fn test_double_tiny_plus_large ( ) {
294
+ fn test_double_different_nan ( ) {
274
295
let a = f64:: from_repr ( 1 ) ;
275
- let b = f64:: from_repr ( 4286990935 ) ;
276
- let r = super :: __adddf3 ( a, b) ;
277
- assert_eq ! ( r. repr( ) , ( a + b) . repr( ) ) ;
296
+ let b = f64:: from_repr (
297
+ 0b1111111111110010001000100101010101001000101010000110100011101011 ) ;
298
+ let x = super :: __adddf3 ( a, b) ;
299
+ let y = a + b;
300
+ if !( x. is_nan ( ) && y. is_nan ( ) ) {
301
+ assert_eq ! ( x. repr( ) , ( a + b) . repr( ) ) ;
302
+ }
278
303
}
279
304
280
305
#[ test]
0 commit comments