C整数除法和楼层
在C中,整数除法a / b和floor(a / b)之间是否有区别,其中a和b都是整数? 更具体地说,在两个过程中发生了什
a/b
整数除法。 如果a
或b
为负数,则结果取决于编译器(在C99之前,舍入可以趋向零或朝向负无穷大;在C99 +中,舍入趋向于0)。 结果是int
类型。 floor(a/b)
执行相同的除法,将结果转换为double,丢弃(不存在的)小数部分,并将结果作为double返回。
floor
返回一个double
而a / b
,其中a
和b
都是整数,产生一个整数值。
使用正确的强制转换值是相同的。
如果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相同的结果。