将 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 的值,结果值将是丢弃小数部分的浮点结果。
我想在 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 的值,结果值将是丢弃小数部分的浮点结果。