对于精确的整数除法,CEIL太高了

时间:2012-10-28 16:57:41

标签: c++ formula ceil off-by-one

今天早上我丢失了一堆文件,但因为它们的内容和外部碎片整理,所以100%恢复所需的所有信息都可用;我只需要在必要时填写FAT。

我编写了一个程序来执行此操作并在我转储到文件的FAT副本上对其进行测试,除了少数文件(526中的17个)之外,它的工作正常,FAT链是一个集群太长,因此与下一个文件交叉链接。

幸运的是,我确切地知道问题所在。我在EOF计算中使用ceil,因为即使单个字节结束也需要一个额外的集群:

//Cluster    is the starting cluster of the file
//Size       is the size (in bytes) of the file
//BPC        is the number of bytes per cluster
//NumClust   is the number of clusters in the file
//EOF        is the last cluster of the file’s FAT chain

DWORD NumClust = ceil( (float)(Size / BPC) )
DWORD EOF      = Cluster + NumClust;

此算法适用于除大小恰好是群集大小的倍数的文件之外的所有内容,在这种情况下,它们最终会成为一个群集。

我考虑了一段时间但是对于这样做的方法感到茫然。看起来它应该很简单,但不知何故,这是非常棘手的。

什么公式适用于任何规模的文件?

3 个答案:

答案 0 :(得分:7)

如果您想要群集数量为(size + BPC - 1) / BPC,则包含所有整数数据类型。

答案 1 :(得分:1)

也许是ceil( (float)((Size - 1) / BPC) )

如果一切都是整数类型,那么更好的是((Size - 1) / BPC) + 1

答案 2 :(得分:0)

ceil( (float)(Size / BPC) )执行整数除法,然后将其转换为浮动。

您需要ceil( (float)Size / BPC )才能正确执行此操作。但是在这里使用浮点数看起来确实是一个坏主意...请参阅整数解的其他答案。