コード例 #1
0
def if_eq_zero(condition, if_result, else_result):
    """
    A short expression which can be compiled quickly.
    :type condition: Union[float, Symbol]
    :type if_result: Union[float, Symbol]
    :type else_result: Union[float, Symbol]
    :return: if_result if condition == 0 else else_result
    :rtype: Union[float, Symbol]
    """
    condition = se.Abs(sign(condition))
    return (1 - condition) * if_result + condition * else_result
コード例 #2
0
def if_greater_zero(condition, if_result, else_result):
    """
    :type condition: Union[float, Symbol]
    :type if_result: Union[float, Symbol]
    :type else_result: Union[float, Symbol]
    :return: if_result if condition > 0 else else_result
    :rtype: Union[float, Symbol]
    """
    _condition = sign(condition)  # 1 or -1
    _if = Max(0, _condition) * if_result  # 0 or if_result
    _else = -Min(0, _condition) * else_result  # 0 or else_result
    return _if + _else + (1 - Abs(_condition)) * else_result # if_result or else_result
コード例 #3
0
def test_sign():
    assert sign(1.2) == 1
    assert sign(-1.2) == -1
    assert sign(3 * I) == I
    assert sign(-3 * I) == -I
    assert sign(0) == 0
    assert sign(nan) == nan
コード例 #4
0
def fmod(a, b):
    s = sign(a)
    a = Abs(a)
    b = Abs(b)
    f1 = a - (b * floor(a / b))
    return s * se.Piecewise([0, Abs(a - b) < SMALL_NUMBER], [f1, True])