为什么这个代码选择乘以(1/16777216)而不是除以16777216



我研究了Numpy如何实现random模块,并看到了以下从随机uint32生成float32的函数:

static NPY_INLINE float next_float(bitgen_t *bitgen_state) {
return (next_uint32(bitgen_state) >> 8) * (1.0f / 16777216.0f);
}

我不明白为什么它们在这里乘以(1.0f / 16777216.0f),而不是简单地除以16777216.0f

编辑:正如我们从编译这个函数的两种方式中可以看到的,生成的代码似乎没有什么区别。因此,这似乎不是";浮点乘法比浮点除法快;。

因为在大多数CPU中,乘法比除法更快。

(1.0f/16777216.0f(在编译过程中被转换为常数,然后计算机只需要在运行时使用乘法。

在C++中,编译器可以设置为使用--ffast数学标志自动进行此优化,而无需在代码中插入x*(1/y)。然而,它可能不安全,因为结果与简单的除法不同(由于舍入误差(。通过显式添加x*(1/y),您可以手动执行编译器将使用此标志执行的操作。

旁注:正如harold所指出的,如果除法结果可以精确地用float表示,编译器可以自动进行优化,即使没有--ffast数学。

最新更新