首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c++中编写日志库10函数?

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

Stack Overflow用户
提问于 2017-01-01 14:50:12
回答 3查看 3.7K关注 0票数 2

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-01 15:10:55

最简单的方法是用泰勒级数计算自然对数(ln)。一旦你找到了自然对数,就把它除以ln(10),得到基-10对数。

在C中实现泰勒级数非常简单。如果z是您要查找日志的数字,则每次只需循环几次累加器乘以(z-1)的迭代即可。在一定程度上,您运行的迭代次数越多,您的结果就越准确。对libC log10()版本进行几次检查,直到您满意它的精确性为止。

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

票数 2
EN

Stack Overflow用户

发布于 2017-01-01 14:54:46

假设"log base 10“,您的意思是”n的次数可以除以10,然后得到一个值< 10":

代码语言:javascript
复制
log = 0;
// Assume n has initial value N
while ( n >= 10 ) {
    // Invariant: N = n * 10^log
    n /= 10;
    log += 1;
}
票数 1
EN

Stack Overflow用户

发布于 2017-01-01 16:15:43

你会得到更快的收敛牛顿的方法。使用类似的方法(手写、未编译或测试使用f(r) = 2**r -x计算log2(x) ):

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41416329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档