如何在 c++ 中编写 log base 10 函数

How to write a log base 10 function in c++?

本文关键字:log base 函数 c++      更新时间:2023-10-16

我知道这似乎是一个重复的问题,但我在以前的问题中找不到答案。我的意思是如何通过简单的循环编写 log base 10 函数,而不是在 c++ 中使用内置的日志函数。

最简单的方法是用泰勒级数计算自然对数 (ln)。找到自然对数后,只需将其除以 ln(10) 即可得到以 10 为底的对数。

泰勒级数在 C 语言中实现起来非常简单。如果z是您查找日志的数字,则只需循环几次迭代,每次将累加器乘以(z-1)。在限制范围内,您运行的迭代次数越多,结果就越准确。对照libC log10()版本检查几次,直到您对精度感到满意。

这是一种"数字方法"。还有其他数字解决方案可以查找数字的对数,可以给出更准确的结果。其中一些可以在我给你的维基百科链接中找到。

假设"log base 10"的意思是"在得到值<10 之前,n 可以除以 10 的次数":

log = 0;
// Assume n has initial value N
while ( n >= 10 ) {
    // Invariant: N = n * 10^log
    n /= 10;
    log += 1;
}

你会更快地收敛牛顿方法。使用这样的东西(手写的未编译或测试使用 f(r) = 2**r - x 来计算 log2(x) ):

double next(double r, double x) {
    static double one_over_ln2 = 1.4426950408889634;
    return r - one_over_ln2 * (1 - x / (1 << static_cast<int>(r)));
double log2(double x) {
    static double epsilon = 0.000000001; // change this to change accuracy
    double r = x / 2;. // better first guesses converge faster
    double r2 = next(r, x);
    double delta = r - r2;
    while (delta * delta > epsilon) { 
        r = r2;
        r2 = next(r, x);
        delta = r - r2
    }
    return r2;
}
double log10(double x) {
    static double log2_10 = log2(10);
    return log2(x) / log2_10;
}