0

バックグラウンド:

値が32ビット浮動小数点数のopcタグがあります。タグは実行中の集計を表します。したがって、ある時点で合計が最大値に達し、0から再開します。タグに関する追加情報は、データ型が単一の浮動小数点数であるが、値は常に整数であるということです(Iタグを作成しなかったので、floatが選択された理由がわかりません)。

私のアプリケーションでは、特定のイベントが発生したときにこの現在の合計の現在の値を記録し、別のイベントが発生したときに合計の現在の値を取得して、差を計算する必要があります。

私が抱えている唯一の問題は、最初の読み取り値を取得するときに値が最大値に近く、2番目の読み取り値を取得する前に0+にロールオーバーすると、差の値が負になることです。

私はこれまでにこれを持っています(それはc#にあります):

    float diff (float a, float b) {
        if (b < a) {
            float f = float.MaxValue - a;
            return f + b;
        }
        return b - a;
    }

しかし、aが巨大でない限り、これは機能しません。float.MaxValue--a ==0。誰かが私がこれを解決する方法を知っていますか?

4

1 に答える 1

2

浮動小数点数は、整数と同じようにオーバーフローしません。

より大きい数に追加する必要がある2つの浮動小数点数を追加するとfloat.MaxValue、結果はfloat.PositiveInfinity、符号付き整数のように大きな負の数や符号なし整数のように小さな正の数ではなくなります。

ただし、その前に、別の問題が発生する可能性があります。小さな数値を大きな数値に追加すると、結果は大きな数値になり、変更されない可能性があります。したがって、スコアが常に(比較的)小さい数だけ増加する場合、特定のポイントの後、スコアはそれ以上変化しないことに気付くでしょう。

このすべてのために、あなたの「ロールオーバー」は決して起こらないでしょう、そして多分あなたは何もする必要がないでしょう。しかし、さらに良い解決策は、整数型を使用して整数を表すことです。これにより、これらの落とし穴をすべて回避できます。

于 2012-06-08T10:25:08.930 に答える