我研究了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数学。