@@ -75,6 +75,10 @@ macro_rules! try_fixed {
7575 } )
7676}
7777
78+ // fn ldexp_f16(a: f16, b: i32) -> f16 {
79+ // ldexp_f64(a as f64, b) as f16
80+ // }
81+
7882fn ldexp_f32 ( a : f32 , b : i32 ) -> f32 {
7983 ldexp_f64 ( a as f64 , b) as f32
8084}
@@ -176,6 +180,12 @@ trait TestableFloat: DecodableFloat + fmt::Display {
176180 fn ldexpi ( f : i64 , exp : isize ) -> Self ;
177181}
178182
183+ // impl TestableFloat for f16 {
184+ // fn ldexpi(f: i64, exp: isize) -> Self {
185+ // f as Self * (exp as Self).exp2()
186+ // }
187+ // }
188+
179189impl TestableFloat for f32 {
180190 fn ldexpi ( f : i64 , exp : isize ) -> Self {
181191 f as Self * ( exp as Self ) . exp2 ( )
@@ -226,6 +236,97 @@ macro_rules! check_exact_one {
226236// [1] Vern Paxson, A Program for Testing IEEE Decimal-Binary Conversion
227237// ftp://ftp.ee.lbl.gov/testbase-report.ps.Z
228238
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+
229330pub fn f32_shortest_sanity_test < F > ( mut f : F )
230331where
231332 F : for < ' a > FnMut ( & Decoded , & ' a mut [ MaybeUninit < u8 > ] ) -> ( & ' a [ u8 ] , i16 ) ,
0 commit comments