From 2b7884e8029d6f5bcd502e7c1d8b63f3ec99b808 Mon Sep 17 00:00:00 2001 From: electria Date: Tue, 21 Jul 2026 10:31:00 -0700 Subject: [PATCH 1/4] feat: add Plank's constant 'h' --- src/nodes/from_str.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/nodes/from_str.rs b/src/nodes/from_str.rs index 94a4af4..ba94dfa 100644 --- a/src/nodes/from_str.rs +++ b/src/nodes/from_str.rs @@ -11,6 +11,8 @@ impl Node { "c" => Self::Number(Float::with_val(PREC, 299_792_458)), "A" => Self::Number(Float::with_val(PREC, 6.02214076e23)), "pi" => Self::Number(Float::with_val(PREC, f64::consts::PI)), + // Planck's constant, in J*s (joule-seconds) + "h" => Self::Number(Float::with_val(PREC, 6.62607015e-34)), _ => Self::Function(s.parse()?), }) } From c108d3a2d2d2328ef6e8b841c705ea2a4b4e9ec8 Mon Sep 17 00:00:00 2001 From: electria Date: Tue, 21 Jul 2026 12:08:40 -0700 Subject: [PATCH 2/4] fix(significant_digits): account for no dot or many dot --- src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 368ef3d..f39ffa4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -47,20 +47,20 @@ pub fn get_significant_digits(n: &Float) -> usize { } if consecutive_zeros >= 10 { - significant_digits = i - consecutive_zeros; + significant_digits = i + 1 - consecutive_zeros; break; } else if consecutive_nines >= 10 { - significant_digits = i - consecutive_nines; + significant_digits = i + 1 - consecutive_nines; break; } if !raw_string[i..raw_string.len()].contains(|c| matches!(c, '1'..='9')) { - significant_digits = i; + significant_digits = i + 1; break; } } - significant_digits + significant_digits - raw_string.chars().filter(|c| *c == '.').count() } #[test] From f9d4290659443e1bd17109b64122665448117600 Mon Sep 17 00:00:00 2001 From: electria Date: Tue, 21 Jul 2026 13:19:32 -0700 Subject: [PATCH 3/4] fix(significant_digits): ignore dot completely --- src/main.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index f39ffa4..9e93fa5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,7 +28,7 @@ pub fn parse_and_calc(s: &str) -> Float { } pub fn get_significant_digits(n: &Float) -> usize { - let raw_string = format!("{n}"); + let raw_string: String = format!("{n}").chars().filter(|c| *c != '.').collect(); let mut significant_digits = raw_string.len() - 1; let mut consecutive_zeros = 0; @@ -55,12 +55,12 @@ pub fn get_significant_digits(n: &Float) -> usize { } if !raw_string[i..raw_string.len()].contains(|c| matches!(c, '1'..='9')) { - significant_digits = i + 1; + significant_digits = i; break; } } - significant_digits - raw_string.chars().filter(|c| *c == '.').count() + significant_digits } #[test] @@ -71,8 +71,12 @@ fn test_get_significant_digits() { assert_eq!(many_nines.to_f64(), 44.0084); let zero_nine_zero = parse_and_calc("2+12321(5+123)"); assert_eq!(zero_nine_zero.to_f64(), 1577090.0); + let test_4 = + parse_and_calc("12.0096 + 1.00784 * 3 + 12.0096 + 1.00784 * 2 + 15.9994 + 1.00784"); + assert_eq!(test_4.to_f64(), 46.06564); assert_eq!(get_significant_digits(&many_zeros), 8); assert_eq!(get_significant_digits(&many_nines), 6); assert_eq!(get_significant_digits(&zero_nine_zero), 6); + assert_eq!(get_significant_digits(&test_4), 7); } From 6e141a01323965bd9f783cc680a1d58a35652d47 Mon Sep 17 00:00:00 2001 From: electria Date: Tue, 21 Jul 2026 13:29:38 -0700 Subject: [PATCH 4/4] refactor(significant_digits): obsolete temp value also use the correct value for if all digits are significant, since we filter out the dot(s). in practice though, this is very rare. --- src/main.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9e93fa5..5a73914 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,7 +30,6 @@ pub fn parse_and_calc(s: &str) -> Float { pub fn get_significant_digits(n: &Float) -> usize { let raw_string: String = format!("{n}").chars().filter(|c| *c != '.').collect(); - let mut significant_digits = raw_string.len() - 1; let mut consecutive_zeros = 0; let mut consecutive_nines = 0; for (i, c) in raw_string.char_indices() { @@ -47,20 +46,18 @@ pub fn get_significant_digits(n: &Float) -> usize { } if consecutive_zeros >= 10 { - significant_digits = i + 1 - consecutive_zeros; - break; + return i + 1 - consecutive_zeros; } else if consecutive_nines >= 10 { - significant_digits = i + 1 - consecutive_nines; - break; + return i + 1 - consecutive_nines; } if !raw_string[i..raw_string.len()].contains(|c| matches!(c, '1'..='9')) { - significant_digits = i; - break; + return i; } } - significant_digits + // all digits are significant + raw_string.len() } #[test]