在C中,a和b是整数的整数除法a/b和floor(a/b)之间是否有区别? 更具体地说,在这两个过程中会发生什么?C整数除法和地板
C整数除法和地板
回答
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 <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
double可以精确地存储所有32位整数值。你总是可以使用double而不是int。不仅不可能失去精确性,而且不可能。你的例子是正确的,但却误导了那些不了解问题的人。 – maxy
在一般情况下,假定整数是两个整数表示的和浮点类型,有ISN没有什么不同,但证据并不明显。问题在于,在浮点中,在分区a/b中发生舍入,因此底层函数不适用于确切的有理值,而是应用于近似值。我写了一篇论文:https://www.vinc17.net/research/publi.html#Lef2005b
总之,我得到的结果是,如果a - b在浮点系统中是完全可表示的,那么floor(a/b),其中a和b b是浮点数(带整数值),给出了与整数除法a/b相同的结果。
- 1. 地板整数除法
- 2. 整数除法用C
- 3. 整数除法和在JavaScript
- 4. 整数除法和零
- 5. C++最好的方法来获得整数除法和余数
- 6. C++整数除法到浮点数
- 7. 整数推广,C++和模板
- 8. 整数除法
- 9. 整数除法
- 10. MIPS:整数乘法和除法
- 11. 整数除零C++
- 12. 铸造整数除法为双用C
- 13. 整数除法优化MSVC C++
- 14. Python3整数除法
- 15. 长整数除法
- 16. SSE整数除法?
- 17. C++整数除法如何工作限制和负值?
- 18. ARM整数除法算法
- 19. 小数整数除法
- 20. 整数IP地址 - C
- 21. 整数除法,并获得整数值
- 22. 整数除法与常规除法
- 23. 整数和C++中
- 24. 整数和用C
- 25. C++ 0xC0000094:零除以整数除
- 26. C++ typedef和模板语法?
- 27. 整数除法属性
- 28. 整数除法与舍入
- 29. 整数除法,舍入
- 30. awk中的整数除法
在C整数除法执行零截断。在C99之前,这是事实确定的。 – ouah
啊,错过了'C'标签。不过,很明显,我的答案是关于C++的。 '' –
@Mysticial问题是'floor'不会在这个例子中舍去任何东西,因为'a/b'执行整数除法,然后*然后*将它传递给'floor'。 – oldrinb