2016-09-28 11 views
1

Я написал этот код, и первый результат цикла - 99. Почему результат 99, когда он должен быть 100?Почему a + = b * pow (10, c-i-1) == 99 C++?

#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 

Могли кто-нибудь объясняет почему?

+1

pow - это удваивает не целые числа. Помните преобразование из двойных в целые усечения. – drescherjm

+2

Поскольку вы используете 'pow', вы должны прочитать: http://stackoverflow.com/questions/588004/is-floating-point-math-broken – NathanOliver

+0

Не 100% уверены, что он должен использоваться как цель обмана. – NathanOliver

ответ

0

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

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

Держу пари, если бросить его было бы правильно в math.h

0

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

math.h и cmath

0

Как люди отмечают, что, вероятно, связано с преобразованием типа переменной и ошибки с плавающей точкой. Pow работает на удвоениях, которые могут иметь ошибки с плавающей запятой. Шансы: pow возвращает значение, подобное 99.9999999, которое затем преобразуется в целое число. Так как целочисленное преобразование усекает вместо раундов, вы получаете 99.