不同的转换double类型到unsigned long long类型导致来自windows和linux的c ++

时间:2017-11-13 08:26:08

标签: c++ linux c++11 mingw

我想从c ++中将double类型转换为usigned long long类型得到一个结果。但是该代码与Windows和Linux有不同的结果。 这是我的代码。

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    cout << (unsigned long long) pow(10, 18) << endl;
    return 0;
}

我只是使用'pow'函数来获得10到18,并将其转换为无符号long long类型。在Windows中,它有99999999999999999(10 ^ 18-1)的结果,但在Linux中有1000000000000000000(10 ^ 18)的结果。 我在Windows中使用MinGW g ++进行C ++ 11编译,在Linux中使用g ++。 这个结果的原因是什么?谢谢。

1 个答案:

答案 0 :(得分:2)

原因是pow对浮点值进行操作,不同的实现可以产生低位略有不同的值。如果需要精确的整数结果,请进行整数运算。

与回答问题的其中一条评论相反,将此调用的结果转换为unsigned long long是完全安全的(对于某些明确的“安全”含义):unsigned long long可以保留值这个对pow的调用返回,结果值将是浮点结果,其分数被丢弃。