如何使用定点算术计算百分比?

时间:2013-10-23 20:39:17

标签: c math fixed point percentage

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

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

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

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

(100 *丢包)/(丢包+传输包)

这会有效,但有一些问题。它只能让我精确到正负1%。您还必须担心溢出问题。

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

1 个答案:

答案 0 :(得分:2)

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

为了更好,更简单* 1000,* 10000等

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

示例:(每千人)

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

这可以重写为宏。