Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CEIL对于精确整数除法来说太高了_C++_Formula_Ceil_Off By One - Fatal编程技术网

C++ CEIL对于精确整数除法来说太高了

C++ CEIL对于精确整数除法来说太高了,c++,formula,ceil,off-by-one,C++,Formula,Ceil,Off By One,今天早上我丢失了一堆文件,但因为它们所在的卷在内部和外部都进行了碎片整理,所以100%恢复所需的所有信息都可用;我只需要在需要的地方补充脂肪 我编写了一个程序来实现这一点,并在我转储到文件的FAT副本上进行了测试,它工作得非常好,除了少数文件(526个文件中的17个),FAT链是一个太长的集群,因此与下一个文件交叉链接 幸运的是,我确切地知道问题是什么。我在EOF计算中使用了ceil,因为即使是一个字节,也需要一个完整的额外集群: //Cluster is the starting clu

今天早上我丢失了一堆文件,但因为它们所在的卷在内部和外部都进行了碎片整理,所以100%恢复所需的所有信息都可用;我只需要在需要的地方补充脂肪

我编写了一个程序来实现这一点,并在我转储到文件的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;
该算法适用于所有情况,但文件大小恰好是集群大小的倍数,在这种情况下,它们最终成为一个过多的集群

我想了一会儿,但不知该怎么做。它看起来应该很简单,但不知何故它却出人意料地棘手

什么公式适用于任何大小的文件?

也许
ceil((float)((size-1)/BPC))


如果一切都是整数类型,那么最好是
((Size-1)/BPC)+1
如果您想要集群的数量,那么它将是
(Size+BPC-1)/BPC
,包含所有整数数据类型。

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


您需要
ceil((float)Size/BPC)
才能正确执行此操作。但是,在这里使用浮动似乎是一个坏主意在第一位。。。查看整数解决方案的其他答案。

为什么首先将其转换为浮点型???@HotLicks,因为没有它,我会得到错误
对ceil的模糊调用…
。为什么您觉得需要使用
ceil
?理论上,一个int的
ceil
应该总是返回相同的int。@HotLicks,即使是一个字节,也意味着一个额外的集群,因此它总是必须向上取整;因此
ceil
。我认为这在逻辑上比实验和依赖整数除法和隐含舍入更清晰。整数除法比依赖整数到浮点的随机转换更可靠。如果你真的想使用ceil,你需要做浮点除法,或者它基本上是不可操作的。嗯,这很奇怪。我想从大小中减去一个只会导致不同的边缘大小错误,但我尝试了,它成功了。ಠ_ಠ 我只能假设这是因为我碰巧没有任何大小适合该特定边缘情况的文件。不管怎样,它都奏效了。谢谢。