C整数除法和楼层

时间:2012-09-02 22:22:02

标签: c integer division integer-division floor

在C中,a和b都是整数的整数除法a / b和floor(a / b)之间是否存在差异? 更具体地说,在两个过程中会发生什么?

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:6)

floor返回double a / b a,其中btypeof都是整数,产生整数值。

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

如果(typeof (a /b)) floor(a / b) == a / b 运算符存在于C中(它不存在),我们会:

(double) (a / b)

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

floor(a / (double) b)

{{1}}

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

答案 2 :(得分:4)

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

#include <stdio.h>
#include <math.h>

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

答案 3 :(得分:1)

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

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