gpt4 book ai didi

c++ - 有效地将 double 除以 2 的幂

转载 作者:可可西里 更新时间:2023-11-01 18:29:44 27 4
gpt4 key购买 nike

我正在实现一个相干噪声函数,并且惊讶地发现使用梯度噪声(即 Perlin 噪声)实际上比值噪声快一点。分析表明,这样做的原因是将随机 int 值转换为范围 -1.0 到 1.0 的 double 值所需的除法:

static double noiseValueDouble(int seed, int x, int y, int z) {
return 1.0 - ((double)noiseValueInt(seed, x, y, z) / 1073741824.0);
}

梯度噪声需要更多乘法,但由于预先计算的梯度表使用 noiseValueInt 直接计算表中的索引,不需要任何除法。所以我的问题是,考虑到除法是 2 的幂 (2^30),我怎样才能使上述除法更有效率。

理论上所有需要做的就是从 double 的指数中减去 30,但是通过蛮力(即位操作)这样做会导致各种极端情况(INF、NAN、指数溢出等) .一个 x86 汇编解决方案就可以了。

最佳答案

用倒数声明一个变量(或常量)并乘以它,有效地将除法变为乘法:

static const double div_2_pow_30 = 1.0 / 1073741824.0;

另一种方法(利用数字是 2 的幂的特性)是用位操作修改指数。这样做会使代码依赖于使用 IEEE 标准存储的 double 值,这可能不太便携。

关于c++ - 有效地将 double 除以 2 的幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8926701/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com