2

私が書いたコードの一部に、プログラムから (つまり MATLAB で) 再現しようとすると発生しない奇妙な動作を見つけました。

次のように、配列に対して操作を行っています。

a[i] = a[i] / (sqrt(b[i]) * sqrt(c[i]));

ここでabcは float 型の配列です。abおよびc事前除算の値の範囲は20006000000

演算の結果は、配列のすべての要素に対してゼロですが、分子と分母の値を別々に見ると、特定の要素に対して、演算は89509.0 / 90240,375に等しくなり0,991895258ます。

では、float を使用したプログラム内での完全な操作が機能しないのはなぜでしょうか。おそらく何時間もの難読化されたデバッグが原因でしょうか?

4

1 に答える 1

7

私が似たような状況に出くわしたとき、それをいくつかのステップに分解し、どのステップが正しく動作し、どのステップが正しく動作しないかを確認すると役立つことがよくあります。たとえば、これについては、次のように分類できます。

float sqrtb = sqrt(b[i]);
float sqrtc = sqrt(c[i]);
float divisor = srqtb * sqrtc;
float dividend = a[i];
float quotient = dividend / divisor;
a[i] = quotient;

これで、各項目を実行して、失敗した場所を確認できます (失敗した場合)。実際、これを行うと、ステップの作成中に問題が見つかり、修正されることがよくあります。

于 2012-10-09T17:48:28.963 に答える