对于c++对数函数的记录:
C++函数__lg()和log2()都是用于计算以2为底的对数的函数,但它们有些地方是不同的。__lg()函数是一个非标准的函数,只在部分编译器中支持,它返回一个整数值,表示输入参数的二进制表示中最高位1的位置(从0开始计数)。例如,__lg(8)将返回3,因为8的二进制表示是1000,最高位1在第3位。log2()函数是C++11标准中提供的函数,它返回一个浮点数值,表示以2为底的对数。例如,log2(8)将返回3.0,因为8等于2的3次方。它们的返回值类型不同,前者返回整数,后者返回浮点数。另外,__lg()是非标准函数,只在部分编译器中支持,而log2()是C++11标准库中的函数,在大部分编译器中都可以使用

作者:糖心伯虎
链接:https://www.zhihu.com/question/446219057/answer/2993917211
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
log函数包括两种函数 一种以e为低的log()函数

另一种为以10为底的log 10()函数;

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	double a=9,b=10;
	cout<<log(a)<<endl;
	cout<<log(exp(a))<<endl;
	cout<<log10(b)<<endl;
	return 0;
}

如果只是要整数不是要精准对数值,可以自己预处理加快速度

下面给出线性递推对数值下取整的代码:

for(int i = 1;i<=n;++i) lg[i] = lg[i>>1] + 1;

**************

#pow函数
double pow(double x,double y);
pow()返回类型是double, 循环计数i与 pow()比较的时候将被转换为两个double比较,于是就出现了边界问题。
pow的计算方式,存在误差,就是说pow(5,2);这条代码,实际上是25,但是由于算法问题很可能返回的值是24.9999,然后转化为整型,变成了24。