• ベストアンサー

<=についての質問

以下のようなプログラムを作りました。 #define M_PI 3.14 for (θ=0;θ<=M_PI/180*10;θ=θ+M_PI/180) {…        } θ=M_PI/180*10の時のプログラムが実行されませんでした。 x<=100とかの場合はx=100の時のプログラムが実行されるのですがなぜでしょうか? いろいろな数字で実行してみたところ、割り切れる数字の時はイコールが有効ですが、割り切れない数字の時はイコールが有効でないような気がします。

質問者が選んだベストアンサー

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

浮動小数点数には誤差があるからです。 この場合だと、 for( int i=0 ; i <= 10 ; i++ ){ θ=M_PI/180*i; … } とするのが手っ取り早いです。

gokugokuR
質問者

お礼

早速の回答ありがとうございます。 for( int i=0 ; i <= 10 ; i++ ){ θ=M_PI/180*i; … } このように書き換えようと思います。 ありがとうございました。

その他の回答 (2)

  • goosyu
  • ベストアンサー率58% (36/62)
回答No.3

 次に(θ<=M_PI/180*10)条件をトレースした結果を載せます。 1 0.00000000000000000 < 0.17444444444444446 2 0.01744444444444445 < 0.17444444444444446 3 0.03488888888888889 < 0.17444444444444446 4 0.05233333333333334 < 0.17444444444444446 5 0.06977777777777779 < 0.17444444444444446 6 0.08722222222222223 < 0.17444444444444446 7 0.10466666666666667 < 0.17444444444444446 8 0.12211111111111111 < 0.17444444444444446 9 0.13955555555555557 < 0.17444444444444446 10 0.15700000000000003 < 0.17444444444444446 11 0.17444444444444449 > 0.17444444444444446 NG   11回目は等しくなるはずですが、浮動小数点の誤差でループ条件を満たしません。  有効桁数※を踏まえて比較すれば0.1744444444444444と同じ値になります。  しかし,条件式では浮動小数の有効桁数※に関係なく比較される為,このような結果になります。  ※double型の場合,有効桁数は15~16桁まで。

gokugokuR
質問者

お礼

なるほど。 つまり、有効数字桁以上の部分は任意の値になってしまうため、割り切れない値の場合、任意の値の関係上イコールになることはないということですね。勉強になりました。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

数学的には 1/3 + 1/3 + 1/3 == 1 ですが少数で計算する場合は 0.3333 + 0.3333 + 0.3333 = 0.9999 != 1.0 というような事になります 浮動小数には常に誤差があることを頭に入れておきましょう

gokugokuR
質問者

お礼

早速の回答ありがとうございます。 浮動小数には誤差があるからうまくいかないのですね。

関連するQ&A