From 6debc4f1c67e86fa249d4c41f5998e54cd91b51a Mon Sep 17 00:00:00 2001 From: Aiden Park <275402320+vip892766gma@users.noreply.github.com> Date: Mon, 25 May 2026 21:54:08 +0000 Subject: [PATCH] chore: improve ryu maintenance path --- tests/d2s_test.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++++ tests/s2d_test.rs | 22 ++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/tests/d2s_test.rs b/tests/d2s_test.rs index 4ad46f3..feb19dd 100644 --- a/tests/d2s_test.rs +++ b/tests/d2s_test.rs @@ -329,3 +329,54 @@ fn test_small_integers() { check!(549755813888000.0); check!(8796093022208000.0); } +#[test] +fn test_boundary_values() { + // Subnormal/normal boundary near f64::MIN_POSITIVE + check!(2.225073858507201e-308); // largest subnormal + check!(2.2250738585072014e-308); // smallest positive normal + check!(2.225073858507202e-308); // just above smallest positive normal + + // Neighbors of powers of two + check!(0.49999999999999994); + check!(0.5); + check!(0.5000000000000001); + check!(0.9999999999999999); + check!(1.0); + check!(1.0000000000000002); + check!(1.9999999999999998); + check!(2.0); + check!(2.0000000000000004); + check!(3.9999999999999996); + check!(4.0); + check!(4.000000000000001); + + // Negative counterparts + check!(-0.49999999999999994); + check!(-2.225073858507201e-308); + check!(-4.000000000000001); + + // Round-trip parse-back assertions + let mut buf = ryu::Buffer::new(); + for f in [ + 2.225073858507201e-308, + 2.2250738585072014e-308, + 2.225073858507202e-308, + 0.49999999999999994, + 0.5, + 0.5000000000000001, + 0.9999999999999999, + 1.0, + 1.0000000000000002, + 1.9999999999999998, + 2.0, + 2.0000000000000004, + 3.9999999999999996, + 4.0, + 4.000000000000001, + -0.49999999999999994, + -2.225073858507201e-308, + -4.000000000000001, + ] { + assert_eq!(f, buf.format(f).parse().unwrap()); + } +} diff --git a/tests/s2d_test.rs b/tests/s2d_test.rs index 7b42164..578647d 100644 --- a/tests/s2d_test.rs +++ b/tests/s2d_test.rs @@ -165,3 +165,25 @@ fn test_issue173() { s2d(b"2.2250738585072014e-308").unwrap(), ); } + +#[test] +fn test_boundary() { + // Subnormal/normal boundary near f64::MIN_POSITIVE + assert_eq!(f64::from_bits(0x000FFFFFFFFFFFFF), s2d(b"2.225073858507201e-308").unwrap()); + assert_eq!(f64::MIN_POSITIVE, s2d(b"2.2250738585072014e-308").unwrap()); + assert_eq!(f64::from_bits(0x0010000000000001), s2d(b"2.225073858507202e-308").unwrap()); + + // Neighbors of powers of two + assert_eq!(f64::from_bits(0x3FDFFFFFFFFFFFFF), s2d(b"0.49999999999999994").unwrap()); + assert_eq!(0.5, s2d(b"0.5").unwrap()); + assert_eq!(f64::from_bits(0x3FE0000000000001), s2d(b"0.5000000000000001").unwrap()); + assert_eq!(f64::from_bits(0x3FEFFFFFFFFFFFFF), s2d(b"0.9999999999999999").unwrap()); + assert_eq!(1.0, s2d(b"1.0").unwrap()); + assert_eq!(f64::from_bits(0x3FF0000000000001), s2d(b"1.0000000000000002").unwrap()); + assert_eq!(f64::from_bits(0x3FFFFFFFFFFFFFFF), s2d(b"1.9999999999999998").unwrap()); + assert_eq!(2.0, s2d(b"2.0").unwrap()); + assert_eq!(f64::from_bits(0x4000000000000001), s2d(b"2.0000000000000004").unwrap()); + assert_eq!(f64::from_bits(0x400FFFFFFFFFFFFF), s2d(b"3.9999999999999996").unwrap()); + assert_eq!(4.0, s2d(b"4.0").unwrap()); + assert_eq!(f64::from_bits(0x4010000000000001), s2d(b"4.000000000000001").unwrap()); +}