在c ++中用logarithm得到错误的答案

时间:2017-01-05 13:31:39

标签: c++ logarithm

我正在用c ++创建一个程序。然后我注意到由于我的程序运行不正常而出现了一些错误

使用的编译器: - Dev c ++

错误是这样的: -

假设n1 = 274877906944, 2 ^ 38 。所以log(n1)应该是38,这是正确的。现在让n2 = 274877906942小于n1。

这意味着如果我们计算log(n2)然后它必须给我小于log(n1)。但是log(n2)给了我与log(n1)相同的结果,即38。 这是错的!!!

有人请解释这个东西..

1 个答案:

答案 0 :(得分:2)

您会看到由于四舍五入而导致的结果。如果你提高了精确度,它就可以了(请注意log2中的<cmath>函数会将整数转换为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

Demo