代码之家  ›  专栏  ›  技术社区  ›  Kevin

在计算中使用数字的绝对值时,保持数字的原始符号

  •  0
  • Kevin  · 技术社区  · 8 月前

    我有一个函数,它接受两个值,取其绝对值中的最小值,并向其添加另一个值。我如何在结果中保持数字的原始符号?

    a = 140
    b = -87
    c = 29.8
    
    def calc(a, b, c):
        d = min((abs(a), abs(b))) + c
        return d
    

    输出结果如下:

    d = 116.8
    

    我希望它能回来:

    d = -116.8
    
    3 回复  |  直到 8 月前
        1
  •  1
  •   Thierry Lathuille    8 月前

    您可以使用键选择具有最小绝对值的值 min . 然后我们在计算中使用这个选定数字的绝对值,并使用 math.copysign 函数为输出赋予符号:

    from math import copysign
    
    M_top__z = 140
    M_bot__z = -87
    N_Ed = 1490
    e_0__z = 0.020
    
    chosen = min(M_top__z, M_bot__z, key=abs)
    M_01__z  = copysign(abs(chosen) + N_Ed*e_0__z, chosen)
    
    
    print(M_01__z)
    # -116.8
    

    编辑为OP无法使用 key=abs 参数到 min (见下文评论)。

    在这种情况下,你可以编写自己的函数来获得绝对值最小的数字:

     def min_abs(a, b):
        if abs(a) < abs(b):
            return a
        else:
            return b
    

    和使用

    chosen = min_abs(M_top__z, M_bot__z)
    

    第二次编辑,因为OP不能使用 if 或者: abs(b) < abs(a) True (1) 或 False (0),因此我们可以将其值用作[a,b]中的索引:

    def min_abs(a, b):
        return [a, b][abs(b) < abs(a)]
    

    整个代码可以很简单:

    from math import copysign
    
    M_top__z = 140
    M_bot__z = -87
    N_Ed = 1490
    e_0__z = 0.020
    
    chosen = [M_top__z, M_bot__z][abs(M_bot__z) < abs(M_top__z)]
    M_01__z  = copysign(abs(chosen) + N_Ed*e_0__z, chosen)
    
    
    print(M_01__z)
    # -116.8
    
        2
  •  0
  •   OldBoy    8 月前

    此代码将执行您想要的操作:

    minsign = M_top__z if abs(M_top__z) < abs(M_bot__z) else M_bot__z
    M_01__z = min((abs(M_top__z), abs(M_bot__z))) + N_Ed*e_0__z
    if minsign < 0:
        M_01__z *= -1
    print(F"{minsign = } {M_01__z = }")
    

    尽管打印的答案在数学上是不正确的。

        3
  •  0
  •   Thomas Weller    8 月前

    直截了当:如果选择的数字是A,而A是负数,则将结果设为负数。如果是B,且B为阴性,则将结果设为阴性。

    M_top__z = 140
    M_bot__z = -87
    N_Ed = 1490
    e_0__z = 0.020
    
    
    def calc_M_01_z(M_top__z, M_bot__z, N_Ed, e_0__z):
        minimum = min((abs(M_top__z), abs(M_bot__z)))
        sign = 1
        if minimum == abs(M_top__z) and M_top__z < 0:
            sign = -1
        elif minimum == abs(M_bot__z) and M_bot__z < 0:
            sign = -1
        M_01__z = sign * (minimum + N_Ed * e_0__z)
        return M_01__z