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