我想从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 ++。 这个结果的原因是什么?谢谢。
答案 0 :(得分:2)
原因是pow
对浮点值进行操作,不同的实现可以产生低位略有不同的值。如果需要精确的整数结果,请进行整数运算。
与回答问题的其中一条评论相反,将此调用的结果转换为unsigned long long
是完全安全的(对于某些明确的“安全”含义):unsigned long long
可以保留值这个对pow
的调用返回,结果值将是浮点结果,其分数被丢弃。