2

我正在尝试使用定点算法计算丢弃数据包的百分比:

丢弃的数据包/(丢弃的数据包+传输的数据包)

一个数据包可以被传输,也可以被丢弃。上面的公式将提供被丢弃的数据包的百分比。

问题是我在定点架构上执行此操作(不允许浮点)。我能想到的最好的是:

(100*丢弃的数据包)/(丢弃的数据包+传输的数据包)

这会起作用,但有几个问题。它只能让我的准确度达到正负 1%。您还必须担心溢出问题。

这一定是一个非常普遍的问题;我想知道是否有更好的方法来做到这一点?

4

1 回答 1

3

OP 方法给出了“精度为正 0% 或负 1%”,而不是“正负 1%”。要获得 +/- 0.5%,请使用 (100*dp + (dp+tp)/2)/(dp + tp)。注意:整数除法会截断,而不是舍入。

为了变得更好,简单的*1000、*10000等。

为避免溢出,请unsigned long long使用uint64_tuintmax_t

示例:(每千人)

unsigned long long DroppedPerThousand(unsigned dropped, unsigned transmitted) {
  unsigned long long sum = dropped;
  sum += transmitted;
  return (1000ULL*dropped + sum/2)/sum;
}

这可以重写为宏。

于 2013-10-23T21:41:07.623 回答