• 締切済み

pow

「1~10までの数、 その2乗、 その3乗」を10行出力するものです。 なぜか5^2 = 24 なってしまいました。なぜですか。お願いします。 #include <stdio.h> #include <math.h> int main(void) { int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 3; j++) { printf("%4d ", (int)pow(i+1, j+1)); } printf("\n"); } return 0; }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.10

#1 が正解なんだけど, 「pow を使う」のがそもそもの敗因>#9.

すると、全ての回答が全文表示されます。
  • ricardo_
  • ベストアンサー率19% (14/72)
回答No.9

 No1 さんが正解じゃないかな。int でキャストせず、浮動小数点数のまま印刷してみたら。

すると、全ての回答が全文表示されます。
回答No.8

別にキャストが嫌いだとは言っていませんが。。。 何故、喧嘩腰なのでしょうか?アホなのでしょうか? 数式のキャストと関数の引数のキャストが違うというのは、どこからのソースでそうおっしゃってられるのでしょうか? ソースがあり、納得出来るものであれば頷きましょう。 VCの歪な仕様のためにfloatでキャストしているのが問題なのではないでしょうか?

すると、全ての回答が全文表示されます。
回答No.7

数式のキャストとC関数のキャストの意味は違います。 どうしてもキャスト演算子を使いたくないなら、math.h ヘッダーファイルに従って下記のようなプログラムにしなければなりません。 なお、VCについては下記参照URLに示すようにマイクロソフトからの通達があります。  「最新版の Visual C++ 2005 では、「double pow(int x, int y);」は ANSI C 準拠に従い削除されています。そのため、プロジェクトのビルド時にコンパイルエラーとして扱うよう仕様が変更されていますので、プロジェクトのアップグレードの際はご注意ください。」 /* rangdon.c pow() test program by gcc * execution: ./rangdon * compile:  gcc rangdon.c -o rangdon */ #include <stdio.h> #include <math.h> int main(void) {  float i, j;  for (i = 1.0; i <= 10.0; i += 1.0) {   for (j = 1.0; j <= 3.0; j += 1.0) {    printf("%4d ", (int)pow(i, j));   // キャストは嫌いだ?   }   printf("\n");  }  return 0; }

参考URL:
http://support.microsoft.com/kb/917085/ja
すると、全ての回答が全文表示されます。
回答No.6

>printf("%d", (int)pow(5, 2)); >の結果はちゃんと25と出るのですが コンパイラがインライン展開したのでは? インライン展開をしないオプションを付けてコンパイルするとどうなりますか?

すると、全ての回答が全文表示されます。
回答No.5

反論もあるかと思いますが、キャストはどうしてもキャストで変換しなければ演算出来ない場合を除き、入れるものではありません。。。 参照URLを参考の事。 VCでコンパイルした場合にdoubleにキャストしないとコンパイル出来ないのは、オーバーロード宣言があるためです。 純粋なCだったらキャストもせずにコンパイルおよび実行に問題がありません。

参考URL:
http://www.kojima-cci.or.jp/fuji/mybooks/cdiag/cdiag.4.3.html
すると、全ての回答が全文表示されます。
回答No.4

 pow() 関数は double pow(double x, double y) です。したがって、pow() に整数のキャスト演算子を用いたように、整数の x,y を使う場合は実数のキャスト演算子が必要です。 /* rangdon.c pow() test program * execution: ./rangdon * compile:  gcc rangdon.c -o rangdon */ #include <stdio.h> #include <math.h> int main(void) {  int i, j;  for (i = 1; i <= 10; i++) {   for (j = 1; j <= 3; j++) {    printf("%4d ", (int)pow((double)i, (double)j));   }   printf("\n");  }  return 0; }

すると、全ての回答が全文表示されます。
回答No.3

VCで試してみましたが、25となりました。 整数どうしの掛け算でどうして誤差が出るのだろう。。。? ※VCではpow関数自体がオーバーロード宣言されているため、幾つかのパターンで試してみましたが、きちんと25となる。 コンパイラに付属している標準ライブラリに問題があるのか???

参考URL:
http://msdn.microsoft.com/ja-jp/library/dt5dakze%28VS.80%29.aspx
rangdon
質問者

お礼

VC++2008で試したら 正常に動作しました。

rangdon
質問者

補足

コンパイラはgccです。 printf("%d", (int)pow(5, 2)); の結果はちゃんと25と出るのですが、 質問のコードだと24となります。 他にも5^3   = 124    10^2 =  99 となってしまいました。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

余談ですけど、「1~10までの1乗、2乗、3乗」を計算するのでしたら、素直に for (i = 1; i <= 10; i++) { for (j = 1; j <= 3; j++) { printf("%4d ", (int)pow(i, j)); と書いてみてはどうですか? pow()の引数をわざわざ+1することがなくなります。

rangdon
質問者

補足

すみません。Cygwinで試しても正常動作しました。(XP) 環境はmingwです。(vista) (独習Cについてきたやつ)

すると、全ての回答が全文表示されます。
回答No.1

"誤差"でしょうね。 24.999... がintに変換されて 24 となったのでしょう。

すると、全ての回答が全文表示されます。

関連するQ&A