- ベストアンサー
<=についての質問
以下のようなプログラムを作りました。 #define M_PI 3.14 for (θ=0;θ<=M_PI/180*10;θ=θ+M_PI/180) {… } θ=M_PI/180*10の時のプログラムが実行されませんでした。 x<=100とかの場合はx=100の時のプログラムが実行されるのですがなぜでしょうか? いろいろな数字で実行してみたところ、割り切れる数字の時はイコールが有効ですが、割り切れない数字の時はイコールが有効でないような気がします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
浮動小数点数には誤差があるからです。 この場合だと、 for( int i=0 ; i <= 10 ; i++ ){ θ=M_PI/180*i; … } とするのが手っ取り早いです。
その他の回答 (2)
- goosyu
- ベストアンサー率58% (36/62)
次に(θ<=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桁まで。
お礼
なるほど。 つまり、有効数字桁以上の部分は任意の値になってしまうため、割り切れない値の場合、任意の値の関係上イコールになることはないということですね。勉強になりました。
- php504
- ベストアンサー率42% (926/2160)
数学的には 1/3 + 1/3 + 1/3 == 1 ですが少数で計算する場合は 0.3333 + 0.3333 + 0.3333 = 0.9999 != 1.0 というような事になります 浮動小数には常に誤差があることを頭に入れておきましょう
お礼
早速の回答ありがとうございます。 浮動小数には誤差があるからうまくいかないのですね。
お礼
早速の回答ありがとうございます。 for( int i=0 ; i <= 10 ; i++ ){ θ=M_PI/180*i; … } このように書き換えようと思います。 ありがとうございました。