Большая арифметика от MinGW провалилась

Моя общая задача - вычислить сумма набора натуральных чисел, каждое из которых умножается на убывающие степени 36, причем первая степень равна размеру набора - 1 По словам Вольфрама,
LaTeX для https://www.wolframalpha.com/input/?i=9*36%5E6%2B13*36%%%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, По словам Алекса Б, минимальная емкость длинного целого числа без знака - от 0 до 18446744073709551615, поэтому проблема не в емкости.


Характеристики:

  • Компилятор: x86_64-w64-mingw32 из набора компиляторов Windows TDM-GCC
  • Составлено через g++ mwe.cpp -std=c++11 -omwe
  • ОС: Windows 10 Home

1 ответ

Из комментария М.М. к вопросу:

pow является функцией с плавающей запятой и поэтому может быть подвержен ошибкам округления. Вместо этого вы должны использовать целочисленные переменные (сделать повторное умножение на 36).

Другие вопросы по тегам