我正在尝试使用定点算法计算丢弃数据包的百分比:
丢弃的数据包/(丢弃的数据包+传输的数据包)
一个数据包可以被传输,也可以被丢弃。上面的公式将提供被丢弃的数据包的百分比。
问题是我在定点架构上执行此操作(不允许浮点)。我能想到的最好的是:
(100*丢弃的数据包)/(丢弃的数据包+传输的数据包)
这会起作用,但有几个问题。它只能让我的准确度达到正负 1%。您还必须担心溢出问题。
这一定是一个非常普遍的问题;我想知道是否有更好的方法来做到这一点?
我正在尝试使用定点算法计算丢弃数据包的百分比:
丢弃的数据包/(丢弃的数据包+传输的数据包)
一个数据包可以被传输,也可以被丢弃。上面的公式将提供被丢弃的数据包的百分比。
问题是我在定点架构上执行此操作(不允许浮点)。我能想到的最好的是:
(100*丢弃的数据包)/(丢弃的数据包+传输的数据包)
这会起作用,但有几个问题。它只能让我的准确度达到正负 1%。您还必须担心溢出问题。
这一定是一个非常普遍的问题;我想知道是否有更好的方法来做到这一点?
OP 方法给出了“精度为正 0% 或负 1%”,而不是“正负 1%”。要获得 +/- 0.5%,请使用 (100*dp + (dp+tp)/2)/(dp + tp)。注意:整数除法会截断,而不是舍入。
为了变得更好,简单的*1000、*10000等。
为避免溢出,请unsigned long long
使用uint64_t
或uintmax_t
。
示例:(每千人)
unsigned long long DroppedPerThousand(unsigned dropped, unsigned transmitted) {
unsigned long long sum = dropped;
sum += transmitted;
return (1000ULL*dropped + sum/2)/sum;
}
这可以重写为宏。