在 C++ 中通过对数得到错误的答案
getting wrong answer by logarithm in c++
好吧,我正在用 C++ 创建一个程序。然后我注意到有一些错误导致我的程序无法正常运行
使用的编译器:- Dev c++
错误是这样的:-
假设 n1=274877906944 即 2^38。所以 log(n1) 应该是 38,这是正确的。现在让 n2=274877906942 小于 n1.
所以这意味着如果我们计算 log(n2) 那么它必须小于 log(n1)。但是 log(n2) 给我的结果与 log(n1) 相同,即 38。
哪个错了!!!
有人请解释一下这些东西..
您看到的结果是四舍五入的结果。如果你提高你的精度,那就没问题了(注意 <cmath>
中的 log2
函数会将你的整数转换为 double
):
std::cout << std::fixed;
std::cout << std::setprecision(16);
std::cout << static_cast<double>(274877906944) << std::endl;
std::cout << static_cast<double>(274877906942) << std::endl;
std::cout << static_cast<double>(274877906948) << std::endl;
std::cout << log2(274877906944) << std::endl;
std::cout << log2(274877906942) << std::endl;
std::cout<< log2(274877906948) << std::endl;
生产:
274877906944.0000000000000000
274877906942.0000000000000000
274877906948.0000000000000000
38.0000000000000000
37.9999999999895053
38.0000000000209965
好吧,我正在用 C++ 创建一个程序。然后我注意到有一些错误导致我的程序无法正常运行
使用的编译器:- Dev c++
错误是这样的:-
假设 n1=274877906944 即 2^38。所以 log(n1) 应该是 38,这是正确的。现在让 n2=274877906942 小于 n1.
所以这意味着如果我们计算 log(n2) 那么它必须小于 log(n1)。但是 log(n2) 给我的结果与 log(n1) 相同,即 38。 哪个错了!!!
有人请解释一下这些东西..
您看到的结果是四舍五入的结果。如果你提高你的精度,那就没问题了(注意 <cmath>
中的 log2
函数会将你的整数转换为 double
):
std::cout << std::fixed;
std::cout << std::setprecision(16);
std::cout << static_cast<double>(274877906944) << std::endl;
std::cout << static_cast<double>(274877906942) << std::endl;
std::cout << static_cast<double>(274877906948) << std::endl;
std::cout << log2(274877906944) << std::endl;
std::cout << log2(274877906942) << std::endl;
std::cout<< log2(274877906948) << std::endl;
生产:
274877906944.0000000000000000
274877906942.0000000000000000
274877906948.0000000000000000
38.0000000000000000
37.9999999999895053
38.0000000000209965