我知道这似乎是一个重复的问题,但我在以前的问题中找不到答案。我的意思是如何通过简单的循环编写日志基10函数,而不使用c++中内置的日志函数。
发布于 2017-01-01 15:10:55
最简单的方法是用泰勒级数计算自然对数(ln)。一旦你找到了自然对数,就把它除以ln(10),得到基-10对数。
在C中实现泰勒级数非常简单。如果z是您要查找日志的数字,则每次只需循环几次累加器乘以(z-1)的迭代即可。在一定程度上,您运行的迭代次数越多,您的结果就越准确。对libC log10()版本进行几次检查,直到您满意它的精确性为止。
这是一种“数字方法”。有其他的数值解可以找到一个数字的对数,可以提供更准确的结果。其中一些可以在我给你的维基百科链接中找到。
发布于 2017-01-01 14:54:46
假设"log base 10“,您的意思是”n的次数可以除以10,然后得到一个值< 10":
log = 0;
// Assume n has initial value N
while ( n >= 10 ) {
// Invariant: N = n * 10^log
n /= 10;
log += 1;
}发布于 2017-01-01 16:15:43
你会得到更快的收敛牛顿的方法。使用类似的方法(手写、未编译或测试使用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;
}https://stackoverflow.com/questions/41416329
复制相似问题