将 double 类型转换为 unsigned long long 类型导致 c++ 来自 windows 和 linux

different casting double type to unsigned long long type result in c++ from windows and linux

我想在 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,并将其转换为 unsigned long long 类型。在 Windows 中,结果为 99999999999999999 (10^18-1),但在 Linux 中结果为 1000000000000000000 (10 ^18)。 我在 Windows 中使用 MinGW g++ 进行 C++11 编译,在 Linux 中使用 g++。 这个结果的原因是什么?谢谢。

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

与对问题的评论之一相反,将此调用的结果转换为 unsigned long long 是完全安全的(对于“安全”的某些合理含义):unsigned long long 可以持有此调用 pow returns 的值,结果值将是丢弃小数部分的浮点结果。