2012-09-02 126 views

回答

11

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

+2

在C整数除法执行零截断。在C99之前,这是事实确定的。 – ouah

+0

啊,错过了'C'标签。不过,很明显,我的答案是关于C++的。 '' –

+0

@Mysticial问题是'floor'不会在这个例子中舍去任何东西,因为'a/b'执行整数除法,然后*然后*将它传递给'floor'。 – oldrinb

6

floor返回doublea/b其中两个ab是整数得到的整数值。

使用正确的投射值是相同的。

如果typeof操作用C存在(事实并非如此),我们将有:

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

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

(double) (a/b) 

floor(a/(double) b) 

答案是肯定的。结果在负值方面有所不同。

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 
+1

double可以精确地存储所有32位整数值。你总是可以使用double而不是int。不仅不可能失去精确性,而且不可能。你的例子是正确的,但却误导了那些不了解问题的人。 – maxy

1

在一般情况下,假定整数是两个整数表示的和浮点类型,有ISN没有什么不同,但证据并不明显。问题在于,在浮点中,在分区a/b中发生舍入,因此底层函数不适用于确切的有理值,而是应用于近似值。我写了一篇论文:https://www.vinc17.net/research/publi.html#Lef2005b

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