2

抱歉没有具体说明,我只是认为上下文并不重要。

无论如何,这个问题可以看作是我在 win32 中 Progressbars上的另一个问题的扩展,我应该把整个代码放在这里还是链接就足够了?

最简单形式的问题可以描述为:

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

现在我需要不小于 d - 0.5;

这可以通过四舍五入轻松实现(转换为 int 会将它们四舍五入为 0)。

正如 Josua Green 所说,这可以通过(int)(d + 0.5)(如果 d>-0.5)来完成,或者std::ceil()如果您愿意。

于 2012-12-23T20:05:52.170 回答
1

转换为 int 会截断双精度:即丢弃任何小数位。

通过将 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 回答
0

总结双打:

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

检查双精度和不超过整数转换超过 0.5

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