计算倒数:n**(-1)还是(1/n)?

1 投票
3 回答
775 浏览
提问于 2025-04-17 03:05

在random.py的源代码中,有这样一个常量定义:

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

我不是数学专业的,但把BPF倒过来,把1放在上面,这样不是更容易理解吗?

或者在编程中,乘法比除法有什么更方便的地方吗?


算了。

为了整理我的问题,我发现了这个:

“在很多机器上,特别是那些没有硬件支持除法的机器,除法的速度比乘法慢,所以这种方法可以大大提高速度。第一步相对较慢,但只需要做一次。”

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

3 个回答

1

"2**-BPF" 的意思是2的-BPF次方。

3

RECIP_BPF这个名字虽然听起来像是1/BPF,但其实它是1/(2的BPF次方)。我个人觉得把它写成2**-BPF比写成1.0/2**BPF更容易理解。

需要注意的是,乘法和除法的速度在这里并不重要;特别是因为这些都是常量,编译器或解释器只需要计算一次(而且编译器甚至可以在编译时就计算出来)。而且,由于这些都是精确的二次幂,我们可以用一些直接的方法来得到结果,而不需要进行乘法或除法,因为浮点数使用的是二进制编码。

1

可读性是个主观的事情。也就是说,我个人觉得 2**-BPF1.0/2**BPF 更容易理解(无论 2**BPF 是否加上括号)。

至于性能差异,我觉得没什么大关系,因为这个表达式只会在模块被导入时计算一次。

撰写回答