- ベストアンサー
C#デバッグモードとデバッグなしモードの違い
- C#デバッグモードとデバッグなしモードで答えが異なる
- C#デバッグモードとデバッグなしモードでの挙動の違いを説明します
- C#デバッグモードで実行すると、答えが予想通りになりますが、デバッグなしモードでは異なる結果が得られます
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
非常に興味深い問題だと思います。 ウチで試してみると、 デバッグモードでもリリースでも bは整数です。 a=3 b=3 になりました。 コマンドラインからの実行では、 bは整数ではありません。 a=2 b=3 になりました。 (1) これは、Math.Logの挙動が違うから違う結果になるのではないかと思います。 つまり、結果が異なる場合、別のMath.Logが使われているのではないかと思います。 これが、バグかと言われると微妙なところだと思います。 コンピュータでは、浮動小数点演算には誤差がつきものです。 bは整数ではありません。 a=2 b=3 の結果になる場合、 Console.WriteLine("a={0} b={1} e={2]",a,b,3.0-b); とやってみると、eとして非常に小さい値が表示されるはずです。 そのために、aは小数部分が捨てられて2になり bは整数ではありませんという結果になります。 (2) Int型にキャストすると、小数部分が(正の数の場合)捨てられてしまうので、意図的にRoundによる丸めをするのも1つの方法ですが、 Int型で解を取得したいからIntにキャストするあるいは丸めるというのは、(1)のようなことを理解した上で実行するべきだと思います。 この場合、結果が理論上整数になると期待しているので、そのような処理をしているのですが、基本的に浮動小数点演算を行った結果が整数になるとか、理論値どおりに求まるとかそういうことを期待してはいけません。コンピュータによる計算にはつねに誤差があることを考慮する必要があります。 また、そういう意味では、Int型へのキャストは、四捨五入による丸めより一般に誤差が大きいと思われるので、整数で結果を得たい場合、Roundする方が良いでしょうね。 この問題の場合、8の素因数分解をすることで 2*2*2の結果を得ることができます。 そのように、結果が整数で得られることが重要な場合、アルゴリズムを考慮する必要があると思います。
お礼
回答どうもありがとうございました。 お礼遅くなり、申し訳ありません。 うちだけの固有の問題だけではないことだけでもわかり、助かりました。 double型なので、しょうがないことなのかもしれませんが、非常に使いづらいのは確かですね。 Math.Logメソッドの少数切捨て・切上げをするときは、少数10桁くらいでまるめてつかうことにします。 他方、デバッグモードとデバッグなしモードで値が違うのはかなり嫌です。 デバッグするのに一苦労です・・・。 いずれにしても、回答どうもありがとうございました。