@@ -75,6 +75,10 @@ macro_rules! try_fixed {
75
75
} )
76
76
}
77
77
78
+ // fn ldexp_f16(a: f16, b: i32) -> f16 {
79
+ // ldexp_f64(a as f64, b) as f16
80
+ // }
81
+
78
82
fn ldexp_f32 ( a : f32 , b : i32 ) -> f32 {
79
83
ldexp_f64 ( a as f64 , b) as f32
80
84
}
@@ -176,6 +180,12 @@ trait TestableFloat: DecodableFloat + fmt::Display {
176
180
fn ldexpi ( f : i64 , exp : isize ) -> Self ;
177
181
}
178
182
183
+ // impl TestableFloat for f16 {
184
+ // fn ldexpi(f: i64, exp: isize) -> Self {
185
+ // f as Self * (exp as Self).exp2()
186
+ // }
187
+ // }
188
+
179
189
impl TestableFloat for f32 {
180
190
fn ldexpi ( f : i64 , exp : isize ) -> Self {
181
191
f as Self * ( exp as Self ) . exp2 ( )
@@ -226,6 +236,97 @@ macro_rules! check_exact_one {
226
236
// [1] Vern Paxson, A Program for Testing IEEE Decimal-Binary Conversion
227
237
// ftp://ftp.ee.lbl.gov/testbase-report.ps.Z
228
238
239
+ // pub fn f16_shortest_sanity_test<F>(mut f: F)
240
+ // where
241
+ // F: for<'a> FnMut(&Decoded, &'a mut [MaybeUninit<u8>]) -> (&'a [u8], i16),
242
+ // {
243
+ // // 0.0999999940395355224609375
244
+ // // 0.100000001490116119384765625
245
+ // // 0.10000000894069671630859375
246
+ // check_shortest!(f(0.1f16) => b"1", 0);
247
+
248
+ // // 0.333333313465118408203125
249
+ // // 0.3333333432674407958984375 (1/3 in the default rounding)
250
+ // // 0.33333337306976318359375
251
+ // check_shortest!(f(1.0f16/3.0) => b"33333334", 0);
252
+
253
+ // // 10^1 * 0.31415917873382568359375
254
+ // // 10^1 * 0.31415920257568359375
255
+ // // 10^1 * 0.31415922641754150390625
256
+ // check_shortest!(f(3.141592f16) => b"3141592", 1);
257
+
258
+ // // 10^18 * 0.31415916243714048
259
+ // // 10^18 * 0.314159196796878848
260
+ // // 10^18 * 0.314159231156617216
261
+ // check_shortest!(f(3.141592e17f16) => b"3141592", 18);
262
+
263
+ // // regression test for decoders
264
+ // // 10^8 * 0.3355443
265
+ // // 10^8 * 0.33554432
266
+ // // 10^8 * 0.33554436
267
+ // check_shortest!(f(ldexp_f16(1.0, 25)) => b"33554432", 8);
268
+
269
+ // // 10^39 * 0.340282326356119256160033759537265639424
270
+ // // 10^39 * 0.34028234663852885981170418348451692544
271
+ // // 10^39 * 0.340282366920938463463374607431768211456
272
+ // check_shortest!(f(f16::MAX) => b"34028235", 39);
273
+
274
+ // // 10^-37 * 0.1175494210692441075487029444849287348827...
275
+ // // 10^-37 * 0.1175494350822287507968736537222245677818...
276
+ // // 10^-37 * 0.1175494490952133940450443629595204006810...
277
+ // check_shortest!(f(f16::MIN_POSITIVE) => b"11754944", -37);
278
+
279
+ // // 10^-44 * 0
280
+ // // 10^-44 * 0.1401298464324817070923729583289916131280...
281
+ // // 10^-44 * 0.2802596928649634141847459166579832262560...
282
+ // let minf16 = ldexp_f16(1.0, -149);
283
+ // check_shortest!(f(minf16) => b"1", -44);
284
+ // }
285
+
286
+ // pub fn f16_exact_sanity_test<F>(mut f: F)
287
+ // where
288
+ // F: for<'a> FnMut(&Decoded, &'a mut [MaybeUninit<u8>], i16) -> (&'a [u8], i16),
289
+ // {
290
+ // let minf16 = ldexp_f16(1.0, -149);
291
+
292
+ // check_exact!(f(0.1f16) => b"100000001490116119384765625 ", 0);
293
+ // check_exact!(f(0.5f16) => b"5 ", 0);
294
+ // check_exact!(f(1.0f16/3.0) => b"3333333432674407958984375 ", 0);
295
+ // check_exact!(f(3.141592f16) => b"31415920257568359375 ", 1);
296
+ // check_exact!(f(3.141592e17f16) => b"314159196796878848 ", 18);
297
+ // check_exact!(f(f16::MAX) => b"34028234663852885981170418348451692544 ", 39);
298
+ // check_exact!(f(f16::MIN_POSITIVE) => b"1175494350822287507968736537222245677818", -37);
299
+ // check_exact!(f(minf16) => b"1401298464324817070923729583289916131280", -44);
300
+
301
+ // // [1], Table 16: Stress Inputs for Converting 24-bit Binary to Decimal, < 1/2 ULP
302
+ // check_exact_one!(f(12676506, -102; f16) => b"2", -23);
303
+ // check_exact_one!(f(12676506, -103; f16) => b"12", -23);
304
+ // check_exact_one!(f(15445013, 86; f16) => b"119", 34);
305
+ // check_exact_one!(f(13734123, -138; f16) => b"3941", -34);
306
+ // check_exact_one!(f(12428269, -130; f16) => b"91308", -32);
307
+ // check_exact_one!(f(15334037, -146; f16) => b"171900", -36);
308
+ // check_exact_one!(f(11518287, -41; f16) => b"5237910", -5);
309
+ // check_exact_one!(f(12584953, -145; f16) => b"28216440", -36);
310
+ // check_exact_one!(f(15961084, -125; f16) => b"375243281", -30);
311
+ // check_exact_one!(f(14915817, -146; f16) => b"1672120916", -36);
312
+ // check_exact_one!(f(10845484, -102; f16) => b"21388945814", -23);
313
+ // check_exact_one!(f(16431059, -61; f16) => b"712583594561", -11);
314
+
315
+ // // [1], Table 17: Stress Inputs for Converting 24-bit Binary to Decimal, > 1/2 ULP
316
+ // check_exact_one!(f(16093626, 69; f16) => b"1", 29);
317
+ // check_exact_one!(f( 9983778, 25; f16) => b"34", 15);
318
+ // check_exact_one!(f(12745034, 104; f16) => b"259", 39);
319
+ // check_exact_one!(f(12706553, 72; f16) => b"6001", 29);
320
+ // check_exact_one!(f(11005028, 45; f16) => b"38721", 21);
321
+ // check_exact_one!(f(15059547, 71; f16) => b"355584", 29);
322
+ // check_exact_one!(f(16015691, -99; f16) => b"2526831", -22);
323
+ // check_exact_one!(f( 8667859, 56; f16) => b"62458507", 24);
324
+ // check_exact_one!(f(14855922, -82; f16) => b"307213267", -17);
325
+ // check_exact_one!(f(14855922, -83; f16) => b"1536066333", -17);
326
+ // check_exact_one!(f(10144164, -110; f16) => b"78147796834", -26);
327
+ // check_exact_one!(f(13248074, 95; f16) => b"524810279937", 36);
328
+ // }
329
+
229
330
pub fn f32_shortest_sanity_test < F > ( mut f : F )
230
331
where
231
332
F : for < ' a > FnMut ( & Decoded , & ' a mut [ MaybeUninit < u8 > ] ) -> ( & ' a [ u8 ] , i16 ) ,
0 commit comments