2016-09-28 15 views
1

私はこのコードを書いて、ループ結果の最初の時間は99です。なぜ結果99が100になるべきですか?私は図書館cmathを使用する場合なぜ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 

の結果は、それがこのコードの結果正解

#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

追加の過負荷は、演算の種類(タイプ1及びタイプ2)の他の組み合わせは、このヘッダー(cmath)で提供される:これらの過負荷を効果的にする場合を除いて、計算の前に引数をDOUBLEにキャスト引数のうち少なくとも1つはlong double型です(この場合、両方ともlong doubleにキャストされます)。

は、私はあなたがそれを唱えた場合、捕虜の

0

のmath.hとcmathのバージョンでは少し異なっているのmath.hで正しいでしょう賭けます。基本的には、cmathバージョンのために、より多くのサポートされている入力があります。これらのリンクで2つを比較することができます。

math.hcmath

0

の人がコメントしたように、それはおそらく、変数の型変換および浮動小数点エラーに関連ます。 Powは浮動小数点エラーを持つ倍精度で動作します。チャンスはpowが99.9999999のような値を返しており、それは整数に変換されます。整数変換はラウンドの代わりに切り捨てられるので、99となります。

関連する問題