C整数除法和楼层

在C中,整数除法a / b和floor(a / b)之间是否有区别,其中a和b都是整数? 更具体地说,在两个过程中发生了什

a/b整数除法。 如果ab为负数,则结果取决于编译器(在C99之前,舍入可以趋向零或朝向负无穷大;在C99 +中,舍入趋向于0)。 结果是int类型。 floor(a/b)执行相同的除法,将结果转换为double,丢弃(不存在的)小数部分,并将结果作为double返回。

floor返回一个doublea / b ,其中ab都是整数,产生一个整数值。

使用正确的强制转换值是相同的。

如果typeof运算符存在于C(它没有),我们将:

 (typeof (a /b)) floor(a / b) == a / b 

编辑:现在,如果问题是:是否有任何区别:

 (double) (a / b) 

 floor(a / (double) b) 

答案是肯定的。 结果与负值不同。

丢失从整数转换为浮点的信息是可能的。 int和double不太可能,但稍有改动:

 #include  #include  int main(void) { unsigned long long a = 9000000000000000003; unsigned long long b = 3; printf("a/b = %llu\n", a/b); printf("floor(a/b) = %f\n", floor(a/b)); return 0; } 

结果:

 a/b = 3000000000000000001 floor(a/b) = 3000000000000000000.000000 

一般来说,假设整数和浮点类型都可以表示整数,没有区别,但certificate并不明显。 问题在于,在浮点中,在a / b分区中发生舍入,因此floor函数不适用于精确的有理值,而是应用于近似值。 我写了一篇关于这个主题的论文: https : //www.vinc17.net/research/publi.html#Lef2005b

简而言之,我得到的结果是,如果a-b在浮点系统中是完全可表示的,那么floor(a / b),其中a和b是浮点数(带整数值),给出与整数除法a / b相同的结果。