0

一時的で散発的な動作を示していたコードをデバッグする必要がありました。これは、最終的に初期化の行で初期化されていないフロートに起因する可能性があります。

float a = number, b, c = other_number;

コードのこのセクションでは、シリアル接続を介してデバイスをすばやくサンプリングし、一定の間隔で出力を平均化していました。たまに 2.7916085e+035という数字が報告されますが、そうでなければコードは意図したとおりに機能し、バグは再現できませんでした。

数値は常に2.7916085e+035だったので、通信処理またはデバイス自体に問題があるのではないかと考えましたが、それらは除外されました。デバッガーで問題のあるサンプルを最終的に見つけるまで、外部干渉のせいにする準備がほとんどできていました。

では、質問に。誰かが2.7916085e+035の重要性を仮定できますか? 私の文脈の外でそれが意味を持っているかどうかはわかりませんが、私を悩ませているのは、この数が本質的に再現不可能なほど再現可能だったことです. つまり、問題を確実に再現することはできませんでしたが、問題が発生したときは常に同じでした。私の理解では、初期化されていない変数は不確定であると想定されています。この問題は、プログラムの実行、フェーズ、時刻などのさまざまな場所で発生しましたが、常に同じシステムで発生したことに注意してください。

動作の原因となった .NET フレームワーク、ランタイム、またはオペレーティング システムに何かありますか? 初期化されていない変数は、幸運にも 0 に設定されなかった場合でも常に同じ値を持っていたため、これを追跡するのは特に面倒でした。

編集:いくつかのコンテキスト。コードは可変ティック レートのタイマー内にあるため、変数はクラスのローカルの非静的メンバーです。

if(//some box checked)
{
    switch(//some output index)
    {
        case problem_variable:
        {
            if(ready_to_sample)
            {
               float average;

               for each(float num in readings)
               {
                 average += num;
               }

               average /= readings.Count;
            }
         }
    }
}

ここで問題の変数はaverage. readings平均したい出力のリストです。average平均ごとに 1 回再宣言されます。これは、秒、分、時間、または条件が満たされるたびに発生する可能性があり、平均を取ります。多くの場合、変数は 0 になりますが、上記の数値になることもあります。

4

4 に答える 4

1

64 ビット バイナリでの double は、次のように変換されます。

0100011101001010111000011101100010100101100010111110100000000000

また

01111010010101110000111011000101

32 ビット浮動小数点として。最近のほぼすべてのプロセッサは、命令とデータ (特に R/W データ) を分離しています。もちろん、例外は古い x86 です。これは CISC プロセッサであり、すべてのバイトが貴重であった時代の 4004 に基づいており、ミニコンピュータでさえ動作するキャッシュがありませんでした。しかし、最新の OS では、4 または 8 KB のページが移動されている間に、古いページを消去せずに命令のページが変更された可能性が非常に高くなります。

ダブルバージョンは次と同等かもしれません

Increment by 1, where r7 (EDI - extended destination index) is selected

2 つ目は float として表示され、x86 または x86-64 に変換されるように見えます。

この x86_64 アセンブリ オペコードを解釈するにはどうすればよいですか?

于 2013-11-03T02:50:35.367 に答える