在 C 中,整数除法 a/b 和 floor(a/b) 之间是否有区别,其中 a 和 b 都是整数?更具体地说,在这两个过程中会发生什么?
问问题
67771 次
4 回答
23
a/b
进行整数除法。如果其中一个a
或b
为负数,则结果取决于编译器(在 C99 之前的版本中,舍入可以趋向零或负无穷大;在 C99+ 中,舍入趋向 0)。结果有类型int
。floor(a/b)
执行相同的除法,将结果转换为双精度,丢弃(不存在的)小数部分,并将结果作为双精度返回。
于 2012-09-02T22:26:59.440 回答
9
floor
返回一段double
时间a / b
,其中a
和b
都是整数产生一个整数值。
使用正确的演员,价值是相同的。
如果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 回答