かずま さんが書きました:
result1 = 3.14.159; * r * r;
3.14.159 は、3.14159 の間違いです。すみません。
かずま さんが書きました:
では、なぜこれらの修正でよいのかを調べて説明してください。
これらとは、
- 3行目を #define PI 3.1459f にすること
- 10行目と 18行目の PI の前に (float) をつけること
result1 = r * r * 3.14159 という式において、
r は float ですから r * r の計算結果も float です。
3.14159 は double です。
(r * r) * 3.14159 は、float * double という異なる型の掛け算です。
この場合、(r * r) は double に変換されます。
そして、(r * r) * PI の計算結果は double になります。
次に、result1 は float です。
double の精度は 10進で約16桁。
float の精度は、10進で約7桁。
double の値を float の変数に代入すると、桁落ちが起こることがあります。
例えば、r が 2.75 の場合、r * r は 7.5625
7.5625 * 3.14159 は 23.7582744
double ではこの値を保持できますが、
float の変数に代入すると、23.75827xx なって値が変わってしまいます。
そのため、「データが失われる可能性があります。」という警告(warning)が
出ているのです。これは警告であってエラーではありません。
3.14159f または 3.14159F と書けば、それは float ですから、
r * r * 3.14159f の計算結果も float になって、警告は出なくなります。
また (float)3.14159 は、キャスト(明示的な型変換) により float に
なるので、r * r * (float)3.14159f の計算結果も float になります。