1

c の学習にコード ブロックを使用しています。私のコードは

#include<stdio.h>
#include<math.h>
int main()
{
  int x;
  x = pow(5,2);
  printf("%d", x);
}

Output is 25

このコードを使用しているとき

#include<stdio.h>
#include<math.h>
int main()
{
  int x,i,j;
  printf("please enter first value");
  scanf("%d", &i);//5
  printf("please enter second value");//2
  scanf("%d", &j);
  x = pow(i,j);
  printf("%d", x);
}

Output is 24

ここで何が問題なのですか?scan 関数を使用して値を取得しているだけで、pow 関数も同じように使用しています。

4

5 に答える 5

8

私はあなたが の素朴な実装を持っているとpow思いますlibm(私は 25 を取得します)。(小さい)整数指数をチェックせずに、それらを特別に処理せずに正pow(x,y)として計算すると、次のようになります。exp(y*log(x))x

Prelude> 2 * log 5
3.2188758248682006
Prelude> exp it
24.999999999999996

double結果は 25 よりわずかに小さいため、変換するとint24 に切り捨てられます。

pow(i,j)確認するには、 の結果を aに割り当て、doubleそれを出力します。

hardcodedを使用pow(5,2)すると、コンパイラ (ほとんどの場合、最適化なしでも gcc が行うことです) は、コンパイル中に結果を正確に計算します。

于 2013-02-24T11:04:34.373 に答える
2

初期化を次のように変更してみてください。

int x=-1 ,i=-1 ,j=-1;

そして最後にこれに出力します:

printf("pow(%d, %d) == %d\n", i, j, x);

それは問題についての良いヒントを与えるはずです。また、 の戻り値を確認scanfしてください。読み取ったアイテムの数を返す必要があります。1 上記のコードで。

scanf に無効な入力を入力したiか、初期化されていないかj、24 がガベージ値であることはほぼ確実です。

また、警告を有効にしてコンパイルし、それらを修正します (のreturn 0;末尾に追加するなどmain)。

于 2013-02-24T10:58:56.663 に答える
1

Your code correctly gives 25 on my windows x64.

You probably needs to run it again see if you just read it wrong...
The missing "return 0;" is not the problem here.

If, anything, could ever go wrong,
you can try adding

fflush(stdin);//or out

after very scanf and printf. If any of the flushes solves your problem, you know what is going wrong.

于 2013-02-24T10:56:05.560 に答える
0

あなたのコードを使用すると、正しい結果25が得られました。float や double などの結果のデータ型を変更してみてください。

于 2013-02-24T15:53:00.303 に答える
0

最後に追加する必要があることを除いて、2番目のプログラムに問題はないようです

return 0;

値 j を 2 で読み取ると、結果はちょうど 25 になります。

于 2013-02-24T10:58:25.850 に答える