From ed7953d8f20d2705a430d0e3a4833d49f42be4c8 Mon Sep 17 00:00:00 2001 From: Paul Date: Sun, 26 Oct 2025 14:35:18 +0100 Subject: [PATCH 1/3] check explicitly for zero components for absolute value --- src/lib.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 661b67b..816832e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1238,12 +1238,16 @@ impl One for Complex { macro_rules! write_complex { ($f:ident, $t:expr, $prefix:expr, $re:expr, $im:expr, $T:ident) => {{ - let abs_re = if $re < Zero::zero() { + let abs_re = if $re.is_zero() { + $T::zero() + } else if $re < Zero::zero() { $T::zero() - $re.clone() } else { $re.clone() }; - let abs_im = if $im < Zero::zero() { + let abs_im = if $im.is_zero() { + $T::zero() + } else if $im < Zero::zero() { $T::zero() - $im.clone() } else { $im.clone() From 05e45e39d623f356a927fab827522b6897af035e Mon Sep 17 00:00:00 2001 From: Paul Date: Sun, 26 Oct 2025 14:36:01 +0100 Subject: [PATCH 2/3] DRY cleanup via lambda --- src/lib.rs | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 816832e..b6bf029 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1238,20 +1238,17 @@ impl One for Complex { macro_rules! write_complex { ($f:ident, $t:expr, $prefix:expr, $re:expr, $im:expr, $T:ident) => {{ - let abs_re = if $re.is_zero() { - $T::zero() - } else if $re < Zero::zero() { - $T::zero() - $re.clone() - } else { - $re.clone() - }; - let abs_im = if $im.is_zero() { - $T::zero() - } else if $im < Zero::zero() { - $T::zero() - $im.clone() - } else { - $im.clone() + let abs = |x: &$T| { + if x.is_zero() { + $T::zero() + } else if *x < Zero::zero() { + $T::zero() - x.clone() + } else { + x.clone() + } }; + let abs_re = abs(&$re); + let abs_im = abs(&$im); return if let Some(prec) = $f.precision() { fmt_re_im( From c17e74dc8da5ccde22d2cb433c76943ffa79da47 Mon Sep 17 00:00:00 2001 From: Paul Date: Sun, 26 Oct 2025 21:54:14 +0100 Subject: [PATCH 3/3] add tests --- src/lib.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index b6bf029..8b12e97 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2716,6 +2716,14 @@ pub(crate) mod test { assert_eq!(format!("{}", c), "-10-10000i"); #[cfg(feature = "std")] assert_eq!(format!("{:16}", c), " -10-10000i"); + + for re in [-0.0, 0.0] { + for im in [-0.0, 0.0] { + let d = Complex::new(re, im); + assert_eq!(format!("{}", d), "0+0i"); + assert_eq!(format!("{:+}", d), "+0+0i"); + } + } } #[test]