MinGW的大型算法失败

时间:2018-11-19 02:44:00

标签: c++ math mingw unsigned-long-long-int

我的一般任务是根据Wolfram计算the sum of a set of positive integers, each multiplied by descending powers of 36, with the first power being the size of the set - 1
LaTeX for https://www.wolframalpha.com/input/?i=9*36%5E6%2B13*36%5E5%2B19*36%5E4%2B6*36%5E3%2B7*36%5E2%2B8*36%2B2

我希望以下内容能返回相同的结果:

#include <iostream>
#include <vector>
#include <math.h>

unsigned long long f(const std::vector<unsigned> &coefficients)
{
    unsigned short exponent = coefficients.size() - 1;
    unsigned long long sum;
    for (unsigned i : coefficients)
    {
        sum += i * pow(36, exponent);
        --exponent;
    }
    return sum;
}

int main()
{
    std::cout << f({9,13,19,6,7,8,2});
}

,但是它返回20416905041。 根据{{​​3}}上的Alex B,无符号长整型整数的最小容量为0到18446744073709709551615,因此容量似乎不是问题。


规格:

  • 编译器:Windows TDM-GCC编译器套件中的x86_64-w64-mingw32
  • 通过g++ mwe.cpp -std=c++11 -omwe
  • 编译
  • 操作系统:Windows 10 Home

1 个答案:

答案 0 :(得分:1)

M.M's comment上出现以下问题:

  

pow是浮点函数,因此很容易出现舍入错误。您应该使用整数变量(重复乘以36)。