【问题标题】:Calculating Reciprocals: n**(-1) or (1/n)?计算倒数:n**(-1) 还是 (1/n)?
【发布时间】:2011-09-26 12:11:23
【问题描述】:

在random.py的源码中,有如下常量定义:

BPF = 53        # Number of bits in a float
RECIP_BPF = 2**-BPF

我不是数学专业的,但是通过在 BPF 上放置 1 来反转 BPF 不是更易读吗?

或者在编程中有没有比除法更方便的乘法?


没关系。

为了解决我的问题,我发现了这个:

“在许多机器上,尤其是那些没有硬件支持除法的机器上,除法运算比乘法运算慢,因此这种方法可以产生相当大的加速。第一步相对较慢,但只需要执行一次。”

http://en.wikipedia.org/wiki/Multiplicative_inverse

【问题讨论】:

  • 2**-BPF1.0 / (2**BPF) 更具可读性

标签: python math computer-science


【解决方案1】:

RECIP_BPF,尽管它的名字,不是 1/BPF。它是 1/(2^BPF)。我不能代表所有人,但我发现2**-BPF1.0/2**BPF 更容易阅读。

请注意,乘法和除法的速度在这里并不重要;特别是,由于这些是常量,编译器或解释器只需要对它们求值一次(编译器甚至可以在编译时进行)。此外,由于它们是 2 的精确幂,因此有直接的方法可以产生结果,而无需进行乘法或除法,利用浮点使用二进制编码这一事实。

【讨论】:

    【解决方案2】:

    可重复性是主观的。也就是说,我个人觉得2**-BPF1.0/2**BPF 更容易阅读(2**BFP 周围有或没有括号)。

    关于性能差异,我怀疑它们是否相关,因为表达式仅在导入模块时评估一次。

    【讨论】:

      【解决方案3】:

      “2**-BPF”表示 2 的 -BPF 次幂。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-30
        • 2022-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        相关资源
        最近更新 更多