我正在研究 Numpy 如何实现 random
模块和 saw the following function to generate a float32
from a random uint32
:
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
。
编辑:As we can see from compiling the two ways of writing this function, there seems to be no difference in the generated code 。所以,这似乎不是“浮点乘法比浮点除法快”的情况。
最佳答案
因为在大多数 CPU 中乘法比除法更快。
(1.0f/16777216.0f) 在编译过程中被转换为常量,然后计算机只需要在运行时使用乘法即可。
在 C++ 中,可以使用 --ffast-math 标志将编译器设置为自动执行此优化,而无需在代码中插入 x*(1/y)
。但是,它可能不安全,因为结果与简单除法不同(由于舍入误差)。通过显式添加 x*(1/y)
,您可以手动执行编译器使用此标志执行的操作。
旁注:正如 harold 所指出的,如果除法结果可以精确地用 float 表示,编译器可以自动执行此优化,即使没有 --ffast-math。
关于python - 为什么这段代码选择乘以(1/16777216)而不是除以16777216?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70600546/