python 符号函数_为什么Python没有符号函数?

“copysign”由IEEE 754定义,是C99规范的一部分。这就是为什么它是用Python编写的。函数不能完全由abs(x)*sign(y)实现,因为它应该如何处理NaN值。>>> import math

>>> math.copysign(1, float("nan"))

1.0

>>> math.copysign(1, float("-nan"))

-1.0

>>> math.copysign(float("nan"), 1)

nan

>>> math.copysign(float("nan"), -1)

nan

>>> float("nan") * -1

nan

>>> float("nan") * 1

nan

>>>

这使得copysign()比sign()更有用。

至于标准Python中没有IEEE的signbit(x)的具体原因,我不知道。我可以做出假设,但那只是猜测。

数学模块本身使用copysign(1,x)作为检查x是否为负或非负的方法。对于大多数处理数学函数的情况,似乎比有1, 0(或1)的符号(x)更有用,因为有一个较少的情况需要考虑。例如,以下内容来自Python的数学模块:static double

m_atan2(double y, double x)

{

if (Py_IS_NAN(x) || Py_IS_NAN(y))

return Py_NAN;

if (Py_IS_INFINITY(y)) {

if (Py_IS_INFINITY(x)) {

if (copysign(1., x) == 1.)

/* atan2(+-inf, +inf) == +-pi/4 */

return copysign(0.25*Py_MATH_PI, y);

else

/* atan2(+-inf, -inf) == +-pi*3/4 */

return copysign(0.75*Py_MATH_PI, y);

}

/* atan2(+-inf, x) == +-pi/2 for finite x */

return copysign(0.5*Py_MATH_PI, y);

在这里,您可以清楚地看到copysign()是一个比三值sign()函数更有效的函数。

你写道:If I were a python designer, I would been the other way around: no cmp() builtin, but a sign()

这意味着您不知道除了数字之外,cmp()还用于其他事情。cmp(“This”,“That”)不能用sign()函数实现。

编辑以将我的其他答案整理到其他位置:

您的理由是abs()和sign()经常一起出现。由于C标准库不包含任何类型的“sign(x)”函数,我不知道您如何证明您的观点是正确的。有一个abs(int)和fabs(double)和fabsf(float)和fabsl(long),但没有提到这个符号。有“copysign()”和“signbit()”,但它们只适用于IEEE 754数字。

对于复数,如果要实现,Python中的sign(-3+4j)将返回什么?abs(-3+4j)返回5.0。这是一个很清楚的例子,说明了在sign()没有意义的地方如何使用abs()。

假设符号(x)被添加到Python中,作为abs(x)的补充。如果“x”是一个实现了uu abs_uu(self)方法的用户定义类的实例,那么abs(x)将调用x.u abs_u()。为了正常工作,为了以同样的方式处理abs(x),Python必须获得一个符号(x)插槽。

对于相对不需要的功能来说,这是过度的。另外,为什么符号(x)存在而非负(x)和非正(x)不存在?我从Python的数学模块实现中得到的代码片段显示了copybit(x,y)如何用于实现nonnegative(),这是一个简单的符号(x)不能做到的。

Python应该对IEEE 754/C99数学函数有更好的支持。这将添加一个signbit(x)函数,在float的情况下,该函数将执行您想要的操作。它不适用于整数或复数,更不用说字符串,而且它也不会有您要找的名称。

你问“为什么”,答案是“符号(x)没有用。”你断言它是有用的。然而,你的评论表明,你所知道的还不足以做出这种断言,这意味着你必须拿出令人信服的证据来证明它的必要性。说NumPy实现了它还不够令人信服。您需要展示如何使用符号函数改进现有代码的案例。

它超出了StackOverflow的范围。把它放到一个Python列表中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值