@@ -87,12 +87,12 @@ macro_rules! add {
87
87
if a_exponent. 0 == 0 {
88
88
let ( exponent, significand) = <$ty>:: normalize( a_significand. 0 ) ;
89
89
a_exponent = Wrapping ( exponent) ;
90
- a_significand = Wrapping ( significand) ;
90
+ a_significand = Wrapping ( significand) ;
91
91
}
92
92
if b_exponent. 0 == 0 {
93
93
let ( exponent, significand) = <$ty>:: normalize( b_significand. 0 ) ;
94
94
b_exponent = Wrapping ( exponent) ;
95
- b_significand = Wrapping ( significand) ;
95
+ b_significand = Wrapping ( significand) ;
96
96
}
97
97
98
98
// The sign of the result is the sign of the larger operand, a. If they
@@ -121,8 +121,8 @@ macro_rules! add {
121
121
if subtraction {
122
122
a_significand -= b_significand;
123
123
// If a == -b, return +zero.
124
- if a_significand. 0 == 0 {
125
- return ( <$ty as Float >:: from_repr( 0 ) ) ;
124
+ if a_significand. 0 == 0 {
125
+ return ( <$ty as Float >:: from_repr( 0 ) ) ;
126
126
}
127
127
128
128
// If partial cancellation occured, we need to left-shift the result
@@ -146,7 +146,7 @@ macro_rules! add {
146
146
}
147
147
148
148
// If we have overflowed the type, return +/- infinity:
149
- if a_exponent >= Wrapping ( max_exponent. 0 as i32 ) {
149
+ if a_exponent >= Wrapping ( max_exponent. 0 as i32 ) {
150
150
return ( <$ty>:: from_repr( ( inf_rep | result_sign) . 0 ) ) ;
151
151
}
152
152
@@ -196,20 +196,18 @@ pub extern fn __aeabi_fadd(a: f32, b: f32) -> f32 {
196
196
197
197
#[ cfg( test) ]
198
198
mod tests {
199
- use core:: { f32, f64} ;
200
- use qc:: { U32 , U64 } ;
201
199
use float:: Float ;
200
+ use qc:: { F32 , F64 } ;
202
201
203
202
// NOTE The tests below have special handing for NaN values.
204
- // Because NaN != NaN, the floating-point representations must be used
203
+ // Because NaN != NaN, the representations are compared
205
204
// Because there are many diffferent values of NaN, and the implementation
206
205
// doesn't care about calculating the 'correct' one, if both values are NaN
207
206
// the values are considered equivalent.
208
207
209
- // TODO: Add F32/F64 to qc so that they print the right values (at the very least)
210
208
quickcheck ! {
211
- fn addsf3( a: U32 , b: U32 ) -> bool {
212
- let ( a, b) = ( f32 :: from_repr ( a. 0 ) , f32 :: from_repr ( b. 0 ) ) ;
209
+ fn addsf3( a: F32 , b: F32 ) -> bool {
210
+ let ( a, b) = ( a. 0 , b. 0 ) ;
213
211
let x = super :: __addsf3( a, b) ;
214
212
let y = a + b;
215
213
if !( x. is_nan( ) && y. is_nan( ) ) {
@@ -219,8 +217,8 @@ mod tests {
219
217
}
220
218
}
221
219
222
- fn adddf3( a: U64 , b: U64 ) -> bool {
223
- let ( a, b) = ( f64 :: from_repr ( a. 0 ) , f64 :: from_repr ( b. 0 ) ) ;
220
+ fn adddf3( a: F64 , b: F64 ) -> bool {
221
+ let ( a, b) = ( a. 0 , b. 0 ) ;
224
222
let x = super :: __adddf3( a, b) ;
225
223
let y = a + b;
226
224
if !( x. is_nan( ) && y. is_nan( ) ) {
@@ -230,95 +228,4 @@ mod tests {
230
228
}
231
229
}
232
230
}
233
-
234
- // More tests for special float values
235
-
236
- #[ test]
237
- fn test_float_tiny_plus_tiny ( ) {
238
- let tiny = f32:: from_repr ( 1 ) ;
239
- let r = super :: __addsf3 ( tiny, tiny) ;
240
- assert_eq ! ( r, tiny + tiny) ;
241
- }
242
-
243
- #[ test]
244
- fn test_double_tiny_plus_tiny ( ) {
245
- let tiny = f64:: from_repr ( 1 ) ;
246
- let r = super :: __adddf3 ( tiny, tiny) ;
247
- assert_eq ! ( r, tiny + tiny) ;
248
- }
249
-
250
- #[ test]
251
- fn test_float_small_plus_small ( ) {
252
- let a = f32:: from_repr ( 327 ) ;
253
- let b = f32:: from_repr ( 256 ) ;
254
- let r = super :: __addsf3 ( a, b) ;
255
- assert_eq ! ( r, a + b) ;
256
- }
257
-
258
- #[ test]
259
- fn test_double_small_plus_small ( ) {
260
- let a = f64:: from_repr ( 327 ) ;
261
- let b = f64:: from_repr ( 256 ) ;
262
- let r = super :: __adddf3 ( a, b) ;
263
- assert_eq ! ( r, a + b) ;
264
- }
265
-
266
- #[ test]
267
- fn test_float_one_plus_one ( ) {
268
- let r = super :: __addsf3 ( 1f32 , 1f32 ) ;
269
- assert_eq ! ( r, 1f32 + 1f32 ) ;
270
- }
271
-
272
- #[ test]
273
- fn test_double_one_plus_one ( ) {
274
- let r = super :: __adddf3 ( 1f64 , 1f64 ) ;
275
- assert_eq ! ( r, 1f64 + 1f64 ) ;
276
- }
277
-
278
- #[ test]
279
- fn test_float_different_nan ( ) {
280
- let a = f32:: from_repr ( 1 ) ;
281
- let b = f32:: from_repr ( 0b11111111100100010001001010101010 ) ;
282
- let x = super :: __addsf3 ( a, b) ;
283
- let y = a + b;
284
- if !( x. is_nan ( ) && y. is_nan ( ) ) {
285
- assert_eq ! ( x. repr( ) , y. repr( ) ) ;
286
- }
287
- }
288
-
289
- #[ test]
290
- fn test_double_different_nan ( ) {
291
- let a = f64:: from_repr ( 1 ) ;
292
- let b = f64:: from_repr (
293
- 0b1111111111110010001000100101010101001000101010000110100011101011 ) ;
294
- let x = super :: __adddf3 ( a, b) ;
295
- let y = a + b;
296
- if !( x. is_nan ( ) && y. is_nan ( ) ) {
297
- assert_eq ! ( x. repr( ) , y. repr( ) ) ;
298
- }
299
- }
300
-
301
- #[ test]
302
- fn test_float_nan ( ) {
303
- let r = super :: __addsf3 ( f32:: NAN , 1.23 ) ;
304
- assert_eq ! ( r. repr( ) , f32 :: NAN . repr( ) ) ;
305
- }
306
-
307
- #[ test]
308
- fn test_double_nan ( ) {
309
- let r = super :: __adddf3 ( f64:: NAN , 1.23 ) ;
310
- assert_eq ! ( r. repr( ) , f64 :: NAN . repr( ) ) ;
311
- }
312
-
313
- #[ test]
314
- fn test_float_inf ( ) {
315
- let r = super :: __addsf3 ( f32:: INFINITY , -123.4 ) ;
316
- assert_eq ! ( r, f32 :: INFINITY ) ;
317
- }
318
-
319
- #[ test]
320
- fn test_double_inf ( ) {
321
- let r = super :: __adddf3 ( f64:: INFINITY , -123.4 ) ;
322
- assert_eq ! ( r, f64 :: INFINITY ) ;
323
- }
324
231
}
0 commit comments