3

ソースコードのサンプルはこちら

#include <iostream.h>
#include <conio.h>
#include <math.h>
 int main()
{
    int i=2,a;
    a= pow(10,i);
    int b=0;
    b+=a;
    cout<<b;
    getch();
}

私が期待する出力100は明らかです。しかし、コンパイラは99出力として提供します。コードの問題と、100出力として取得するために修正する方法を説明してください。

4

5 に答える 5

2

pow(10,i)99.99999999999 は整数 a=99 にフロアされます

独自の整数オーバーロードを作成することもできますpow(int,int)

良い一日。

于 2012-08-31T10:14:17.557 に答える
2

この行を変更します。

a = round(pow(10,i));

round関数は次のように記述できます。

int round(double r) {
    return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}

注: pow()は double を返すため、このような問題を回避する最善の方法はa、 ではなく double にすることintです。

于 2012-08-31T10:19:38.450 に答える
0

pow のドキュメントは次のとおりです。

#include <math.h>
  double  pow (double x, double y)
  long    powl (long double x, long double y)
  float   powf (float x, float y)

pow(10, 2)であり、おそらく次のdoubleように計算されています。99.99999999999

だからあなたのライン

a = pow(10, i)に格納99.99999999999されているintため、切り捨てが発生しa99!

私が何を意味するかを確認するためにcout、アフターを試してみてください。a = pow(10, i);

aとして宣言することで、おそらくこれを修正できますlong。試す価値がある...

の戻り値を!ではなくorpowとして格納することをお勧めします。doublefloatint

于 2012-08-31T10:56:49.487 に答える
0

FPU 丸めモードを変更します。丸めからゼロに変換して、最も近いものに丸めます。これを行う方法は C 標準では定義されていないため、組み込み命令またはインライン アセンブラを使用する必要があります。

于 2012-08-31T10:18:38.063 に答える
0

ceil()値を整数に丸めるために使用する必要がありますdouble。割り当ては同じですfloor()-あなたの場合は浮動小数点数の小数部分を切り捨てdoubleます(正の数)。数学的丸めを取得することも役立つ場合があります-floor(x + 0.5)xの場合ceil(x - 0.5)、負の場合。

于 2012-08-31T10:21:07.580 に答える