2016-09-28 99 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

战俘是双打而不是整数。记住从double到整数截断的转换。 – drescherjm

+2

因为你使用的是'pow',所以你应该阅读:http://stackoverflow.com/questions/588004/is-floating-point-math-broken – NathanOliver

+0

不是100%确定它是否应该用作伪装目标。 – NathanOliver

回答

0

从这个链路在此标头(CMATH),用于算术类型(类型1和类型2)的其他组合提供cplusplus.com

附加重载:这些过载的有效投其参数加倍计算之前,除非在至少有一个参数的类型是long double(在这种情况下,两者都被转换为long double)。

我敢打赌,如果你施放它,它会在math.h中正确战俘

0

的文件math.h和CMATH版本略有不同。基本上cmath版本支持更多的输入。您可以在这些链接中比较两者。

math.hcmath

0

正如人们评价说,它可能涉及到的变量类型转换和浮点错误。 Pow在双打上运行,可能会出现浮点错误。机会是pow返回一个值,如99.9999999然后被转换为一个整数。由于整数转换截断,而不是轮次,你得到99.

相关问题