pow関数を用いた整数計算について
Posted: 2012年10月03日(水) 00:35
はじめまして。Mokoと申します。
C言語プログラムを始めて3ヶ月くらいになります。
20年くらい前、大学でBASICを使ったことがあります。(つまりそんな年齢です。お恥ずかしい・・・)
環境はWindows7にEclipse4.2をインストールして実行しています。
コンパイラはMinGWというのでしょうか、Eclipseに付属のものを使用しています。
整数10のべき乗計算をしようと思い、以下のようなプログラムを作成してみました。
実行結果は、
1
10
99
1000
9999
となりました。当然期待した結果ではありません。適当にいろいろいじって次のように修正したところ、
こちらの欲しい結果が表示されました。
(一度計算結果をdouble型の変数に代入し、改めてint型にキャストしています。)
質問1.
sample-1とsample-2で、なぜ結果が異なるのでしょうか。(なぜsample-2だと正しい結果が得られるので
しょうか。)
double型とint型ではデータのサイズが異なるため、キャストすると情報がこぼれてしまう、というところは
なんとなく(あやふやですみません)理解しているつもり(またまたすみません)です。
特に疑問に思うのは、double型の変数に代入することでいった何が起きるのか?というところです。
あるいはEclipseの使い方を間違えていたりするのでしょうか。
質問2.
sample-2のようなコードは正しいのでしょうか。つまり、整数のべき乗計算を行う際、sample-2のように
一度double型の変数に代入し、その後intへキャストすれば必ず正しい解を得られるのでしょうか。
以上、よろしくお願いいたします。
C言語プログラムを始めて3ヶ月くらいになります。
20年くらい前、大学でBASICを使ったことがあります。(つまりそんな年齢です。お恥ずかしい・・・)
環境はWindows7にEclipse4.2をインストールして実行しています。
コンパイラはMinGWというのでしょうか、Eclipseに付属のものを使用しています。
整数10のべき乗計算をしようと思い、以下のようなプログラムを作成してみました。
/* sample-1 */
#include <stdio.h>
#include <math.h>
int main ( void )
{
int counter = 0;
int answer = 0;
for ( ; counter < 5; counter++ ) {
answer = (int)pow ( 10.0, (double)counter );
printf ( "%d\n", answer );
}
return 0;
}
1
10
99
1000
9999
となりました。当然期待した結果ではありません。適当にいろいろいじって次のように修正したところ、
こちらの欲しい結果が表示されました。
(一度計算結果をdouble型の変数に代入し、改めてint型にキャストしています。)
/* sample-2 */
#include <stdio.h>
#include <math.h>
int main ( void )
{
int counter = 0;
double answer1 = 0.0;
int answer2 = 0;
for ( ; counter < 5; counter++ )
{
answer1 = pow ( 10.0, (double)counter );
answer2 = (int)answer1;
printf ( "%d\n", answer2 );
}
return 0;
}
sample-1とsample-2で、なぜ結果が異なるのでしょうか。(なぜsample-2だと正しい結果が得られるので
しょうか。)
double型とint型ではデータのサイズが異なるため、キャストすると情報がこぼれてしまう、というところは
なんとなく(あやふやですみません)理解しているつもり(またまたすみません)です。
特に疑問に思うのは、double型の変数に代入することでいった何が起きるのか?というところです。
あるいはEclipseの使い方を間違えていたりするのでしょうか。
質問2.
sample-2のようなコードは正しいのでしょうか。つまり、整数のべき乗計算を行う際、sample-2のように
一度double型の変数に代入し、その後intへキャストすれば必ず正しい解を得られるのでしょうか。
以上、よろしくお願いいたします。