Почему a+=b*pow(10,c-i-1) == 99 С++?

Я написал этот код, и первый раз результат цикла равен 99. Почему результат 99, когда он должен быть 100?

#include <iostream>
#include<math.h>
using namespace std;
int main ()
{
  int skt = 0;
  int sk[3];
int nsk = 3;
sk[0]=1;
sk[1]=2;
sk[2]=8;
for (int i=0; i<nsk; i++)
{
    skt = skt + (sk[i]*pow(10.0,nsk-i-1));
    cout <<" "<<skt<<endl;
}

}

результат этого кода

   99
   119
   127

, но если я использую библиотеку cmath, это правильный ответ

#include <iostream>
#include<cmath>
using namespace std;
int main ()
{
  int skt = 0;
  int sk[3];
int nsk = 3;
sk[0]=1;
sk[1]=2;
sk[2]=8;
for (int i=0; i<nsk; i++)
{
    skt = skt + (sk[i]*pow(10.0,nsk-i-1));
    cout <<" "<<skt<<endl;
}

}

результат этого кода

    100
    120
    128

Кто-нибудь может объяснить, почему?


person Robert Rusiecki    schedule 28.09.2016    source источник
comment
pow предназначен для двойных, а не целых чисел. Помните, что преобразование из двойного числа в целое усекается.   -  person drescherjm    schedule 28.09.2016
comment
Поскольку вы используете pow, вы должны прочитать: stackoverflow.com/ вопросы/588004/   -  person NathanOliver    schedule 28.09.2016
comment
Не уверен на 100%, следует ли его использовать в качестве мишени для обмана.   -  person NathanOliver    schedule 28.09.2016
comment
Кроме того, действительно нет причин вызывать pow, если все, что вам нужно, это степени 10. Простая таблица поиска будет намного быстрее, чем вызов функции pow.   -  person PaulMcKenzie    schedule 28.09.2016
comment
Невозможно дублировать. Но опять же, это зависит от того, как реализована функция pow, переключателей компилятора, версий компилятора и т. д. Но если вам нужна согласованность, прекратите использовать pow и используйте простую таблицу, как это видно   -  person PaulMcKenzie    schedule 28.09.2016


Ответы (3)


Версии pow для math.h и cmath немного отличаются. В основном есть больше поддерживаемых входов для версии cmath. Вы можете сравнить их по этим ссылкам.

math.h и cmath

person Jacob McCarthy    schedule 28.09.2016

Как прокомментировали люди, это, вероятно, связано с преобразованием типа переменной и ошибками с плавающей запятой. Pow работает с двойниками, которые могут иметь ошибки с плавающей запятой. Скорее всего, pow возвращает значение вроде 99,9999999, которое затем преобразуется в целое число. Поскольку целочисленное преобразование усекает вместо округления, вы получаете 99.

person DavidP    schedule 28.09.2016

по этой ссылке cplusplus.com

В этом заголовке ( cmath ) представлены дополнительные перегрузки для других комбинаций арифметических типов (Type1 и Type2): эти перегрузки эффективно приводят свои аргументы к типу double перед вычислениями, за исключением случаев, когда хотя бы один из аргументов имеет тип long double (в этом случае вместо этого оба преобразуются в long double).

Бьюсь об заклад, если вы разыграете это, это будет правильно в math.h

person corn3lius    schedule 28.09.2016