【发布时间】:2012-01-19 13:21:12
【问题描述】:
我正在实现一个相干噪声函数,并且惊讶地发现使用梯度噪声(即 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) 的幂,我怎样才能使上述除法更有效。
理论上,所有需要做的就是从双精度数的指数中减去 30,但是通过蛮力(即位操作)这样做会导致各种极端情况(INF、NAN、指数溢出等) .一个 x86 汇编解决方案就可以了。
【问题讨论】:
-
你确定它有那么重要吗?使用机器特定的位操作是不可移植的,甚至可能因为缓存或调度问题而影响性能......
-
@BasileStarynkevitch 这就是我最后一段的意思。假设 IEEE 754,我不想进行位操作,但使用特定于 x86 的汇编解决方案就可以了。
-
我不会为此烦恼。你不会赢得太多,而且你可能会失去一些表现。
-
如果你开启了优化,编译器应该已经用乘以倒数代替了除法。
-
请发布替代功能。