c++ - C/C++ 最快的 cmath 日志操作

标签 c++ c logarithm math.h cmath

我正在尝试计算 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/

相关文章:

c++ - 如果未使用 CloseHandle 正确关闭,则重新打开串行端口会失败

c++ - 在形式参数列表中自动使用 const 和按引用传递有什么明显的后果?

c - C语言以2为底的对数

javascript - Amcharts v3 XY 不适用于对数刻度

python - 为什么当我执行 'log' 时,我的 matplotlib 条形图会压缩 x 轴

C++98,但 clang-tidy 说使用 nullptr?

C++ 类不是自身的基础

无法构建 C 程序

C 输入和输出

c - 为什么 getaddrinfo 需要 3 个 header ?