我正在尝试编写一个简单的log base 2方法.我知道在计算机上表示像std :: log(8.0)和std :: log(2.0)这样的东西很困难.我也理解std :: log(8.0)/ std :: log(2.0)可能会导致一个非常低于3.0的值.我不明白的是为什么将下面的计算结果放入一个double并使其成为左值然后将其转换为unsigned int会比直接转换公式更改结果.下面的代码显示我的测试用例在我的32位debian wheezy机器上反复失败,但在我的64位debian wheezy机器上反复传递.
#include <cmath>
#include "assert.h"
int main () {
int n = 8;
unsigned int i =
static_cast<unsigned int>(std::log(static_cast<double>(n)) /
std::log(static_cast<double>(2)));
double d =
std::log(static_cast<double>(n)) / std::log(static_cast<double>(2));
unsigned int j = static_cast<unsigned int> (d);
assert (i == j);
}
Run Code Online (Sandbox Code Playgroud)
我也知道我可以使用位移来以更可预测的方式得出我的结果.我很好奇为什么要运行double导致操作与操作有任何不同,而不是将该值粘贴到堆栈中的double并在堆栈上转换double.