【发布时间】:2017-11-13 08:26:08
【问题描述】:
我想在 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++。 这个结果的原因是什么?谢谢。
【问题讨论】:
-
根据this answer,没有安全的方法可以安全地执行演员阵容。我建议找到一个合适的
ipow实现来安全地计算整数类型的幂。 (例如stackoverflow.com/questions/17719674/…) -
你也可以自己写函数。这里还有一个例子stackoverflow.com/questions/101439/…
-
@SimonKraemer 当浮点值超出
unsigned long long的范围时,就会发生危险。虽然对于这个特定示例来说并非如此,但需要注意 -
@M.M 是的......我在那里有点快。至少我的评论通过引用整数算术解决方案显示了一个可能的解决方案 - 尽管在这种情况下解释是错误的。