【发布时间】:2012-08-02 03:26:11
【问题描述】:
我需要在循环中有效地将一些常量添加或乘以 double 类型的结果,以防止下溢。例如,如果我们有 int,则乘以 2 的幂将很快,因为编译器将使用位移位。有没有一种常量形式可以实现高效的double 加法和乘法?
编辑:似乎没有多少人理解我的问题,为我的草率道歉。我将添加一些代码。
如果a是一个int,这个(乘以2的幂)会更高效
int a = 1;
for(...)
for(...)
a *= somefunction() * 1024;
当 1024 被替换为 1023 时。如果我们想添加到 int 中,不确定什么是最好的,但这不符合我的兴趣。我对a 是双倍的情况感兴趣。我们可以有效地将和乘以双精度数的常量形式(例如 2 的幂)是什么?常数是任意的,只要足够大以防止下溢即可。
这可能不仅限于 C 和 C++,但我不知道更合适的标记。
【问题讨论】:
-
有一个代码示例可能会有所帮助。顺便说一句,您认为整数的位移比乘以 2 的幂更快的假设是不正确的。如果你写
x*4,编译器会自动把它转换成x<<2。 -
听起来你正在做过早的优化,这通常不是一个好主意,而是让编译器为你处理更好。 “我们应该忘记小的效率,比如说大约 97% 的时间:过早的优化是万恶之源”,Donald Knuth
-
@jahhaj 我知道。我想说乘以 2 或 4 比乘以 3 快。
-
@ggg,如果你的代码中有这样的常量,现代编译器通常能够自己进行这种优化。您是否检查过编译器生成的汇编程序,例如使用
-S?您是否将编译器升级到最新版本?您是否确保拥有适合您平台的最佳优化选项,例如-O3 -march=native?您是否对代码进行了基准测试? -
考虑到问题的总体水平,这几乎可以肯定是过早优化的情况。集中精力让代码正确。只有当它通过所有测试时(写出可以准确复现的测试),才考虑它对于普通用户来说是否太慢。
标签: c++ c optimization underflow