- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:浮動小数演算での誤差の蓄積が起こっているのかどうか)
浮動小数演算での誤差の蓄積が起こっているのかどうか
このQ&Aのポイント
- C++でプログラミングの勉強をしています。ある実数演算(double)をする関数A(実数パラメータxを用いた積算)を2種類の方法で用いると、結果が微妙に変わってしまいます。条件は同じなので、同じ結果が出て欲しいのですが、結果が変わってしまい困っています。原因としては何が考えられるでしょうか?
- ループ中に共有している変数は必ず初期化しているのに、前のパラメータの時の実数演算の誤差が積み重なっている可能性はありますか?ソースコードは複雑なため、載せることはできません。原因として考えられることを教えて頂けると助かります。
- 悩んでいる現象は、パラメータxを微小に変化させながら関数Aをfor文でループさせ、最後の結果を入手する方法と、パラメータxの大きさを同じにして関数Aを1回のみ用いて結果を入手する方法で、微妙に結果が変わる点です。条件は同じだと思うので、なぜ結果が異なるのかがわかりません。どんなことが考えられる原因でしょうか?
- みんなの回答 (5)
- 専門家の回答
お礼
無事同じ結果が出ました. やはり,実数を何回も足していたのが原因でした. 私の些細なミスに対して,時間を割いてまで回答して頂きありがとうございました. doradora55さんの欄にて回答して頂いた皆様にお礼を申し上げます.
補足
回答の通りかもしれません. (1)はパラメータxを0.01刻みでループさせています. 例えば 「xを0.25まで加算させた際の結果」と 「xに0.25を代入した際の結果」では違う値になっている可能性があります. それならば,ループの際に0.01加算するのではなく, 「x(整数型にしておく)に1加算して,100で割る」 という方法で対処できますか? つまり,0.01ずつ加算して0.25を表現する(A式)のではなく, B式でやれば誤差は生じないでしょうか? A式:y(実数) = x(実数) + 0.01で B式:y(実数) = ( x(整数) + 1 ) / 100