确实,数学中包含一个补丁,但未被接受,因为他们在所有极端情况下(+/- 0,+ /-nan等)均未就应返回的内容达成共识。sign()
因此,他们决定仅实施copysign,尽管可以使用它(尽管更为冗长),才能将最终情况下所需的行为委托给最终用户-有时可能需要调用cmp(x,0)
。
我不知道为什么它不是内置的,但我有一些想法。
copysign(x,y):
Return x with the sign of y.
最重要的copysign
是,是的超集sign
!copysign
x = 1的调用与sign
函数相同。因此,您可以使用它,copysign
而 不必理会它 。
>>> math.copysign(1, -4)
-1.0
>>> math.copysign(1, 3)
1.0
如果您厌倦了传递两个完整的参数,则可以采用sign
这种方式来实现,它仍将与其他人提到的IEEE兼容:
>>> sign = functools.partial(math.copysign, 1) # either of these
>>> sign = lambda x: math.copysign(1, x) # two will work
>>> sign(-4)
-1.0
>>> sign(3)
1.0
>>> sign(0)
1.0
>>> sign(-0.0)
-1.0
>>> sign(float('nan'))
-1.0
其次,通常,当您需要某物的符号时,您最终会将其乘以另一个值。当然,基本上就是copysign
这样。
因此,代替:
s = sign(a)
b = b * s
您可以这样做:
b = copysign(b, a)
是的,我很惊讶您已经使用Python 7年了,认为cmp
可以如此轻松地将其删除并替换为sign
!您是否从未使用__cmp__
方法实现类?您是否从未调用cmp
和指定自定义比较器函数?
总而言之,我发现自己也想要一个sign
函数,但是copysign
第一个参数为1就可以了。我不同意这样做sign
会比有用copysign
,因为我已经证明它只是相同功能的一部分。