修复平台表达式安全除法运行时

This commit is contained in:
boris
2026-07-05 02:01:55 +08:00
parent 339f85c27b
commit 4e3ae3b378
2 changed files with 35 additions and 0 deletions
@@ -614,6 +614,13 @@ impl PlatformExprStrategy {
lhs / rhs
}
});
engine.register_fn("safe_div", |lhs: f64, rhs: f64| {
if rhs.abs() <= f64::EPSILON {
0.0
} else {
lhs / rhs
}
});
engine.register_fn(
"iff",
|condition: bool, when_true: Dynamic, when_false: Dynamic| {
@@ -8432,6 +8439,32 @@ mod tests {
assert!(!rewritten.contains('?'));
}
#[test]
fn platform_expr_safe_div_supports_two_and_three_arg_forms() {
let strategy = PlatformExprStrategy::new(PlatformExprStrategyConfig::microcap_rotation());
assert_eq!(
strategy
.engine
.eval::<f64>("safe_div(6.0, 3.0)")
.expect("two-arg safe_div should evaluate"),
2.0
);
assert_eq!(
strategy
.engine
.eval::<f64>("safe_div(6.0, 0.0)")
.expect("two-arg safe_div should use zero fallback"),
0.0
);
assert_eq!(
strategy
.engine
.eval::<f64>("safe_div(6.0, 0.0, -1.0)")
.expect("three-arg safe_div should preserve explicit fallback"),
-1.0
);
}
#[test]
fn platform_expr_limit_flags_are_directional() {
assert!(PlatformExprStrategy::price_is_at_or_above_upper_limit(
@@ -140,6 +140,7 @@ const RESERVED_SCOPE_NAMES: &[&str] = &[
"ask1_volume",
"turnover_ratio",
"effective_turnover_ratio",
"up_days_stock",
"open",
"high",
"low",
@@ -328,6 +329,7 @@ mod tests {
"avg_cost",
"current_price",
"stock_ma_short",
"up_days_stock",
] {
assert!(
names.contains(required),