20

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

4

4 回答 4

23

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

于 2012-09-02T22:26:59.440 回答
9

floor返回一段double时间a / b,其中ab都是整数产生一个整数值。

使用正确的演员,价值是相同的。

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

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

编辑:现在如果问题是:有什么区别:

(double) (a / b)

floor(a / (double) b)

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

于 2012-09-02T22:26:07.793 回答
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
于 2012-09-02T23:28:34.683 回答
2

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

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

于 2014-06-27T11:01:46.943 回答