我正在尝试使用定点运算来计算丢弃数据包的百分比:
丢弃数据包/(丢弃数据包+传输数据包)
可以传输数据包,也可以丢弃数据包。上面的公式将提供丢弃的数据包的百分比。
问题是我在修复点架构上执行此操作(不允许浮点)。我能想出的最好的是:
(100 *丢包)/(丢包+传输包)
这会有效,但有一些问题。它只能让我精确到正负1%。您还必须担心溢出问题。
这一定是一个非常普遍的问题;我想知道是否有更好的方法来做到这一点?
答案 0 :(得分:2)
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;
}
这可以重写为宏。