这两者之间有什么区别吗:
float foo1 = (int)(bar / 3.0); float foo2 = floor(bar / 3.0);
据我所知,两种情况的结果是一样的。编译后的代码有什么不同吗?
编辑: 因为问题可能已经被修改,由于之间的 fabs()和 floor()混淆。
fabs()
floor()
根据最初的问题例句:
1. float foo = (int)(bar / 3.0); 2. float foo = fabs(bar / 3.0);
不同之处在于,如果 bar 是负的,那么第一个的结果是负的,而第二个的结果是正的。第一个将被截断为一个整数,第二个将返回包括小数部分在内的完整的十进制值。
所以,101,不要在人们回答你的问题后改变你的问题,而是写一个新的问题。
为什么你认为他们会有相同的结果?
float foo = (int)(bar / 3.0) //will create an integer then assign it to a float float foo = fabs(bar / 3.0 ) //will do the absolute value of a float division bar = 1.0 foo1 = 0; foo2 = 0.33333...
是的。fabs返回其参数的绝对值,对 int 的强制转换导致除法被截断(截断到最接近的 int) ,因此结果几乎总是不同的。
fabs
(int) x是保留 x整数部分的请求(这里没有四舍五入)
(int) x
x
fabs(x) = | x | 所以它是 >= 0;
fabs(x)
>= 0
例如: (int) -3.5返回 -3; fabs(-3.5)返回 3.5;
(int) -3.5
-3
fabs(-3.5)
3.5
一般来说, 所有 x 的 fabs (x) >= x;
fabs (x) >= x
如果是 x >= 0
x >= 0
如果是 x < 0
x < 0
转换为 int 将被截断为零。floor()将向负无穷大方向截断。如果 bar为负,这将给出不同的值。
bar
如前所述,对于正数,它们是相同的,但对于负数,它们是不同的。规则是 int 向0转,而 floor 向负无穷大转。
floor(4.5) = (int)4.5 = 4 floor(-4.5) = -5 (int)(-4.5) = -4
这就是说,在执行时间上也存在差异。在我的系统里,我计算过铸造速度至少是地板速度的3倍。
我有代码,需要一个有限范围的值,包括负数的地板操作。它需要非常高效,所以我们使用下面的函数:
int int_floor(double x) { return (int)(x+100000) - 100000; }
当然,对于非常大的 x 值(您会遇到一些溢出问题)和 -100000以下的负值,这将会失败,等等。但是我已经计算出它至少比地板快3倍,这对我们的应用程序来说是非常关键的。对此持保留态度,在你的系统中进行测试等等,但恕我直言,这值得考虑。
主要有两个不同之处:
正如其他人所指出的,转换为整数将被截断为零,而 floor()将总是被截断为负无穷大; 这是负操作数的不同行为。
似乎还没有人指出另一个区别——如果你的参数大于或等于 MAX_INT+1(或小于 -MAX_INT-1) ,那么转换为 int将导致最顶端的位被丢弃(可能是 C)或未定义的行为(C + + ,可能是 C)。如果你的 int是32位,你将只有一个符号位加上31位的数据。因此,使用这与 double的大小将产生意想不到的结果。
MAX_INT+1
-MAX_INT-1
int
double