修复平台表达式安全除法运行时
This commit is contained in:
@@ -614,6 +614,13 @@ impl PlatformExprStrategy {
|
|||||||
lhs / rhs
|
lhs / rhs
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
engine.register_fn("safe_div", |lhs: f64, rhs: f64| {
|
||||||
|
if rhs.abs() <= f64::EPSILON {
|
||||||
|
0.0
|
||||||
|
} else {
|
||||||
|
lhs / rhs
|
||||||
|
}
|
||||||
|
});
|
||||||
engine.register_fn(
|
engine.register_fn(
|
||||||
"iff",
|
"iff",
|
||||||
|condition: bool, when_true: Dynamic, when_false: Dynamic| {
|
|condition: bool, when_true: Dynamic, when_false: Dynamic| {
|
||||||
@@ -8432,6 +8439,32 @@ mod tests {
|
|||||||
assert!(!rewritten.contains('?'));
|
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]
|
#[test]
|
||||||
fn platform_expr_limit_flags_are_directional() {
|
fn platform_expr_limit_flags_are_directional() {
|
||||||
assert!(PlatformExprStrategy::price_is_at_or_above_upper_limit(
|
assert!(PlatformExprStrategy::price_is_at_or_above_upper_limit(
|
||||||
|
|||||||
@@ -140,6 +140,7 @@ const RESERVED_SCOPE_NAMES: &[&str] = &[
|
|||||||
"ask1_volume",
|
"ask1_volume",
|
||||||
"turnover_ratio",
|
"turnover_ratio",
|
||||||
"effective_turnover_ratio",
|
"effective_turnover_ratio",
|
||||||
|
"up_days_stock",
|
||||||
"open",
|
"open",
|
||||||
"high",
|
"high",
|
||||||
"low",
|
"low",
|
||||||
@@ -328,6 +329,7 @@ mod tests {
|
|||||||
"avg_cost",
|
"avg_cost",
|
||||||
"current_price",
|
"current_price",
|
||||||
"stock_ma_short",
|
"stock_ma_short",
|
||||||
|
"up_days_stock",
|
||||||
] {
|
] {
|
||||||
assert!(
|
assert!(
|
||||||
names.contains(required),
|
names.contains(required),
|
||||||
|
|||||||
Reference in New Issue
Block a user