python - 为什么这段代码选择乘以(1/16777216)而不是除以16777216?

标签 python c numpy random

我正在研究 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/

相关文章:

java - 为什么使用十六进制值而不是普通的 10 进制数字?

python - 多处理中的共享内存对象

python - 测试复杂的数据类型?

c - 用char数组存储单词C语言

python - 将背景图片设置为QTextEdit

C/Linux - 扫描文本文件中的行以查找特定单词

python - 无法将稀疏矩阵写入 csv

python - 将(部分)numpy recarray 转换为二维数组?

python - 为什么 json 模块没有安装在 python 的本地 virtualenv 版本中?

python 安装工具 : ImportError: cannot import name Library