我正在尝试计算 logab(并得到一个 float ,而不是整数)。我打算用 log(b)/log(a)
来做这件事。从数学上讲,我可以使用任何 cmath
对数函数(以 2、e 或 10 为底)进行此计算;但是,我会在我的程序中经常运行这个计算,所以我想知道其中一个是否比其他的快得多(或者更好的是,如果有更快但仍然简单的方法来做到这一点)。如果重要的话,a 和 b 都是整数。
最佳答案
首先,预先计算 1.0/log(a)
并将每个 log(b)
乘以该表达式。
编辑:我最初说自然对数(以 e 为底)是最快的,但其他人说处理器直接支持以 2 为底的并且最快。我没有理由怀疑。
编辑 2: 我最初认为 a
是一个常数,但在重新阅读从未陈述过的问题时。如果是这样,那么预先计算将没有任何好处。但是,如果是这样,您可以通过选择适当的变量名来保持可读性:
const double base_a = 1.0 / log(a);
for (int b = 0; b < bazillions; ++b)
double result = log(b) * base_a;
奇怪的是,Microsoft 不提供 base 2 日志功能,这解释了为什么我不熟悉它。还有x86 instruction for calculating logs自动包含乘法,不同基数所需的常数也可通过 optimized instruction 获得。 ,所以我希望 3 个不同的日志函数具有相同的时序(即使基数 2 也必须乘以 1)。
关于c++ - C/C++ 最快的 cmath 日志操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6655860/