如何在 c++ 中编写 log base 10 函数
How to write a log base 10 function in c++?
我知道这似乎是一个重复的问题,但我在以前的问题中找不到答案。我的意思是如何通过简单的循环编写 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;
}
相关文章:
- 如何用数字处理log(0)
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 构造函数采用 Base&不被调用
- 安装opencv失败-粘贴CMakeError.log的内容
- 将sharet_ptr<Derived>转换为shared_ptr<Base>
- 将 BASE 派生类存储在同一容器中
- 避免矢量中的对象切片<Base><shared_ptr>
- 从 std<Derived>::shared_ptr 的向量返回 std::shared_ptr<Base>
- 如何从unique_ptr返回unique_ptr的引用<Derived><Base>?
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 如何将unique_ptr<derived>*转换为<base>unique_ptr*?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 从 Base 引用对象调用派生类的成员
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- boost日志文件无法创建sample.log文件
- 从"<Base>std::unique_ptr"创建"ClassType<std::unique_ptr>"时出现编译错误<Derived>
- C++ - 打印派生类对象的矢量<base*> 元素
- 为什么在此示例中从unique_ptr自动向上转换<derived>到unique_ptr<base>失败?
- 如何在 c++ 中编写 log base 10 函数