32 lines
1.2 KiB
Python
32 lines
1.2 KiB
Python
from __future__ import annotations
|
|
from typing import Any
|
|
|
|
MATH_OPERATIONS: dict[str, Any] = {
|
|
'ADD': lambda a, b, t: a + b,
|
|
'SUBTRACT': lambda a, b, t: a - b,
|
|
'MULTIPLY': lambda a, b, t: a * b,
|
|
'DIVIDE': lambda a, b, t: a / b if b != 0 else 0,
|
|
'ABS': lambda a, b, t: abs(a),
|
|
'NEGATE': lambda a, b, t: -a,
|
|
'POWER': lambda a, b, t: t(a ** b) if not (a == 0 and b < 0) else 0,
|
|
'MIN': lambda a, b, t: min(a, b),
|
|
'MAX': lambda a, b, t: max(a, b),
|
|
'SIGN': lambda a, b, t: (a > 0) - (a < 0),
|
|
'DIVIDE_ROUND': lambda a, b, t: t(round(a / b)) if b != 0 else 0,
|
|
'DIVIDE_FLOOR': lambda a, b, t: a // b if b != 0 else 0,
|
|
'DIVIDE_TRUNCATE': lambda a, b, t: t(a / b) if b != 0 else 0,
|
|
'MODULO_FLOORED': lambda a, b, t: a % b if b != 0 else 0,
|
|
'MODULO_TRUNCATED': lambda a, b, t: a - (b * t(a / b)) if b != 0 else 0,
|
|
}
|
|
|
|
|
|
def evaluate_math_operation(operation: str, val_a: Any, val_b: Any, math_type: type = float) -> Any:
|
|
op_fn = MATH_OPERATIONS.get(operation)
|
|
if not op_fn:
|
|
return 0
|
|
try:
|
|
a_num = math_type(val_a if val_a is not None else 0)
|
|
b_num = math_type(val_b if val_b is not None else 0)
|
|
return op_fn(a_num, b_num, math_type)
|
|
except Exception:
|
|
return 0
|