2

具体的でなくて申し訳ありません。文脈は重要ではないと思っただけです。

とにかく、質問はwin32 のプログレスバーに関する私の他の質問の延長として見ることができます。ここにコード全体を配置する必要がありますか、それともリンクで十分ですか?

最も単純な形式の問題は、次のように説明できます。

double d1 = x.xxxxxx;
double d2 = x.xxxxxx;
double d3 = x.xxxxxx;
double d4 = x.xxxxxx;
double d5 = x.xxxxxx;
...
...
double dn = x.xxxxxx;


int i1 = (int)d1;
int i2 = (int)d2;
int i3 = (int)d3;
int i4 = (int)d4;
int i5 = (int)d5;
...
...
int in = (int)dn;

int i = i1+i2+i3+i4+i5+...+in;
double d = d1+d2+d3+d4+d5+...+in;

now i needs to be not less then d - 0.5;

どうやってするか ?

編集: コードが変更されました。編集 2: n の数を予測することはできず、d1、d2、...、dn が 1 未満 (0.345627 など) である可能性があります。

4

4 に答える 4

4

あなたが興味を持っているのはエラー拡散だと思います:

double d1 = x.xxxxxx;
double d2 = x.xxxxxx;
double d3 = x.xxxxxx;
double d4 = x.xxxxxx;
double d5 = x.xxxxxx;

double error = 0;
int i1 = (int)floor(d1+error+0.5);
error += d1-i1;
int i2 = (int)floor(d2+error+0.5);
error += d2-i2;
int i3 = (int)floor(d3+error+0.5);
error += d3-i3;
int i4 = (int)floor(d4+error+0.5);
error += d4-i4;
int i5 = (int)floor(d5+error+0.5);

int i = i1+i2+i3+i4+i5;
double d = d1+d2+d3+d4+d5;

値を四捨五入するたびに、導入された誤差の量がわかり、次の計算に修正が反映されます。このようにして、エラーが蓄積することはありません。

于 2012-12-23T20:13:58.163 に答える
1

intに変換すると、doubleが切り捨てられます。つまり、小数ビットが削除されます。

正の数に0.5を追加し、負の数に-0.5を追加することで、より一般的な動作が得られます。

int ToInt(double x)
{
   double dx = x < 0.0 ? -0.5 : 0.5;
   return static_cast<int>(x + dx);
}
于 2012-12-23T20:24:35.127 に答える
1

ここで、d - 0.5 未満である必要はありません。

これは、double を切り上げることで簡単に実現できます (int にキャストすると、0 に向かって丸められます)。

Josua Green が言うように、これは(int)(d + 0.5)(if d>-0.5) で、または必要std::ceil()に応じて実行できます。

于 2012-12-23T20:05:52.170 に答える
0

ダブルスを合計します。

double d = d1+d2+d3+d4+d5;

double の合計が整数変換を 0.5 以上超えていないことを確認します

if (d - (int)d > 0.5) { /* Error? */ }
于 2012-12-23T20:07:43.913 に答える