【问题标题】:different casting double type to unsigned long long type result in c++ from windows and linux不同的双精度类型转换为无符号长长类型导致来自 Windows 和 linux 的 c++
【发布时间】: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 是的......我在那里有点快。至少我的评论通过引用整数算术解决方案显示了一个可能的解决方案 - 尽管在这种情况下解释是错误的。

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


【解决方案1】:

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

与回答问题的 cmets 之一相反,将此调用的结果转换为 unsigned long long 是完全安全的(对于“安全”的某些合理含义):unsigned long long 可以保存此调用的值pow 返回,结果值将是浮点结果,其分数被丢弃。

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2015-07-26
    • 1970-01-01
    相关资源
    最近更新 更多