在C++中,log2() 和 log2l() 返回不同的值

In C++, log2() and log2l() returning different values

本文关键字:返回 log2l log2 C++      更新时间:2023-10-16

当我在编码时,我偶然发现了一些东西C++,对于某个值nlog2(n)log2l(n)的返回值是完全不同的:

#include<bits/stdc++.h>
using namespace std;
int main(){
int d= log2l(288230376151711743);
cout<<d;
return 0;
}

上面的代码显示值 57,而以下代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
int d= log2(288230376151711743);
cout<<d;
return 0;
}

执行时显示值58

为什么会发生这种情况,有人可以解释一下吗?

这是因为您将双精度转换为整数数据类型,这会将其向下舍入。

#include <bits/stdc++.h>
using namespace std;
int main() {
cout << log2(288230376151711743) << "n";
cout << log2l(288230376151711743) << "n";
cout << (int) log2(288230376151711743) << "n";
cout << (int) log2l(288230376151711743) << "n";
cout << (long) log2(288230376151711743) << "n";
cout << (long) log2l(288230376151711743) << "n";
cout << (double) log2(288230376151711743) << "n";
cout << (double) log2l(288230376151711743) << "n";
return 0;
}

尝试运行此代码并观察结果。 日志2 文档

尝试使用以下表达式自己动手:

auto log2 = log2(288230376151711743); // log2 => double | log2l() => long double

你会知道变量d是一个设置为double的数据类型,同样如果你对log2l()做同样的事情,你会发现d设置为long double,即函数log2l()返回一个long double,但是在从long double转换为int时,该值正在向下舍入。

这就是为什么,它会为log2()显示58.相反,当变量为整数时,57log2l()