0

2 つの静的符号なし long 変数間の減算に問題があります。

私の変数は次のように定義されています。

static unsigned long actual_value;
static unsigned long incoming;
static unsigned long outgoing;

while サイクルで行う操作は次のとおりです。

actual_value = actual_value - (outgoing - incoming) / 1000;

ここで、「発信」は常に「着信」より > です。問題は、私の actual_value が反復ごとに変化しないことです。while サイクルの他の時点で「actual_value」の値を変更することは決してないため、問題はここにあります。

実際、その方程式を次のように置き換えてみると:

actual_value = actual_value - 1;

各反復で値が 1 ずつ減少します。

ただし、次のように変更すると:

actual_value = actual_value - 0.1;

繰り返しのたびに、値は 1 ずつ減少します。したがって、静的な符号なし変数がどのように機能するかを完全には理解していないと思います。

問題はどこですか?

前もって感謝します。

4

3 に答える 3

2

私のコメントであるあなたの応答に基づいて -outgoing - incomingが 未満で1000あるため、 の結果(outgoing - incoming) / 1000は常に 0 になります。

解決策は、必要なものによって異なります。除算から実際の値を取得したい場合は、次のようにします。

( outgoing - incoming ) / 1000.0

これはと同じです

( outgoing - incoming ) / 1000.

次に、0 から 1 の間の浮動小数点数を取得します。

しかし、あなたは何を達成したいですか?( outgoing - incoming )is always< 1000で notの場合0、このコードは常にactual_valueby1の値をそのまま減少させactual_valueますunsigned longoutgoing - incomingが 0 の場合に限り、はactual_value変更されません。これはあなたが必要とするものですか?


以下のコメントに基づいて、floatまたはをdouble入力する必要がありますactual_value。そして、使用しますactual_value -= ( outgoing - incoming ) / 1000.;

に最も近い整数値を出力したい場合はactual_value

printf( "%ul\n", (unsigned long)( actual_value + .5 ) );
于 2013-02-08T10:03:08.497 に答える
1

static算術演算の結果にはまったく影響を与えず、変数のストレージの詳細を処理するだけであるということを忘れることができます。

これは、整数演算が...まあ整数であるという問題のように聞こえます。

0.1を減らすと、丸めが有利に機能するため、機能します(インクリメントは機能しません)。

しかし、あなたの式(outgoing - incoming) / 1000整数であり、おそらく0に評価されます。

また、次のように最初の式を記述する必要があります。

actual_value -= (outgoing - incoming) / 1000;

それははるかに明確です。もちろん、これは、デバッガーを使用してデバッグし、何が起こっているかを確認するのも簡単です。

于 2013-02-08T10:00:06.660 に答える
1

(outgoing - incoming)が 1000 未満の場合、毎回0減算しているため、(outgoing - incoming) / 1000は に評価され0ます。

于 2013-02-08T09:57:14.243 に答える