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