铸造到室内对地板

这两者之间有什么区别吗:

float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);

据我所知,两种情况的结果是一样的。编译后的代码有什么不同吗?

101076 次浏览

编辑: 因为问题可能已经被修改,由于之间的 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) ,因此结果几乎总是不同的。

(int) x是保留 x整数部分的请求(这里没有四舍五入)

fabs(x) = | x | 所以它是 >= 0;

例如: (int) -3.5返回 -3; fabs(-3.5)返回 3.5;

一般来说, 所有 x 的 fabs (x) >= x;

如果是 x >= 0

如果是 x < 0

转换为 int 将被截断为零。floor()将向负无穷大方向截断。如果 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倍,这对我们的应用程序来说是非常关键的。对此持保留态度,在你的系统中进行测试等等,但恕我直言,这值得考虑。

主要有两个不同之处:

  1. 正如其他人所指出的,转换为整数将被截断为零,而 floor()将总是被截断为负无穷大; 这是负操作数的不同行为。

  2. 似乎还没有人指出另一个区别——如果你的参数大于或等于 MAX_INT+1(或小于 -MAX_INT-1) ,那么转换为 int将导致最顶端的位被丢弃(可能是 C)或未定义的行为(C + + ,可能是 C)。如果你的 int是32位,你将只有一个符号位加上31位的数据。因此,使用这与 double的大小将产生意想不到的结果。