【发布时间】:2017-05-01 17:37:37
【问题描述】:
我需要在 c++ 代码中进行以下计算:
(((n*log(n)) / log(4)) + 1)
其中 n 是 'unsigned long long int' 类型(并且是 2 的幂,因此结果应该是整数)。
对于非常大的数字,我得到一些错误,例如 n = 9007199254740992 结果应该是 238690780250636289,但是当我运行代码时,我得到 238690780250636288。
这可能是“log”函数没有使用“unsigned long long int”参数实现的结果吗?如果是这样,有没有办法在不实现新的日志功能的情况下绕过它?
unsigned long long int upToBit(unsigned long long int n) {
unsigned long long int check = (((n*log(n)) / log(4)) + 1);
return check;
}
【问题讨论】:
-
JFYI,C++11 允许简化计算:
(((n*log(n)) / log(4)) + 1) = (((n*log(n)) / (2*log(2))) + 1) = n/2 * std::log2(n) + 1 -
哇,这么多括号!难怪我在需要的时候找不到。