如何在c ++中编写日志库10函数?

时间:2017-01-01 14:50:12

标签: c++ loops logarithm

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

3 个答案:

答案 0 :(得分:2)

最简单的方法是使用Taylor series计算自然对数(ln)。一旦找到了自然对数,只需将其除以ln(10)即可得到基数为10的对数。

泰勒系列在C中实现非常简单。如果z是您要查找日志的数字,则只需循环几次迭代,每次将累加器乘以(z-1) 。在极限情况下,运行的迭代次数越多,结果就越准确。对libC log10()版本进行几次检查,直到您对精度感到满意为止。

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

答案 1 :(得分:1)

假设“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;
}

答案 2 :(得分:0)

使用牛顿方法可以更快地收敛。使用这样的东西(手写未编译或测试使用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;
}