pow(a,b) возвращает на 1 меньше фактического значения, когда b больше 15?

    int n = 15;
    unsigned long long int s,a;
    s=pow(10,n) + 2;
    a=1000000000000000+2;
    cout<<s<<endl;
    cout<<a;

здесь вывод 10000000000000001 и 1000000000000002 как это вообще возможно. Я использую блоки кода на 64-битных окнах.


person Swastik Singh    schedule 12.01.2020    source источник
comment
Это одна из проблем использования pow с целыми числами.   -  person drescherjm    schedule 12.01.2020
comment
@Fredrik это происходит в моей системе   -  person Swastik Singh    schedule 12.01.2020
comment
@Fredrik, с этим кодом нет никаких проблем, об этом позаботится автоматическое преобразование из целого числа в число с плавающей запятой / двойное число. Вы можете включить предупреждения об автоматическом преобразовании -Wconversion в GCC/clang, но обычное поведение заключается в том, чтобы просто выполнить преобразование.   -  person Marco Bonelli    schedule 12.01.2020
comment
@Fredrik Честно говоря, -Wconversion - довольно необычный флаг. Он не включен ни в -Wall, ни в -Wextra.   -  person HolyBlackCat    schedule 12.01.2020
comment
Чтобы было ясно, ошибочные результаты, которые вы показали, относятся к n=16 (как указано в заголовке), а не к n=15, как вы показали в своем коде. 1000000000000001 (16 цифр) точно можно представить как двойное число. 10000000000000001 (17 цифр) не является - ближайшими двойниками являются 10000000000000000 и 10000000000000002.   -  person J...    schedule 12.01.2020