投到int与地板

这些有什么区别:

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

据我所知,这两个案件都有同样的结果。 编译代码有没有区别?

投射到一个int将被截断为零。 floor()将被截断为负的无限。 如果bar是消极的,这会给你不同的价值。

如前所述,对于正数,它们是相同的,但是它们的负数不同。 规则是int向0转,而floor向负infinity转。

 floor(4.5) = (int)4.5 = 4 floor(-4.5) = -5 (int)(-4.5) = -4 

这就是说,执行时间也有所不同。 在我的系统上,我已经计算出铸造至less比地面快3倍。

我有代码,需要在有限的价值范围的底线操作,包括负数。 它需要非常高效,所以我们使用下面的函数:

 int int_floor(double x) { return (int)(x+100000) - 100000; } 

当然,这会失败的非常大的值x(你会遇到一些溢出问题)和负值低于-100000等,但我已经钟表至less3倍地板,这是非常关键为我们的应用。 拿一粒盐,在你的系统上testing它,但这是值得考虑恕我直言。

你为什么认为他们会有相同的结果?

 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()floor()之间的混淆,问题可能已被修改。

给出最初的问题示例行:

 1. float foo = (int)(bar / 3.0); 2. float foo = fabs(bar / 3.0); 

不同的是,如果bar是负数,结果会是第一个是负数,第二个是正数。 第一个将被截断为一个整数,第二个将返回包含小数部分的完整小数值。

是。 fabs返回它的参数的绝对值,而cast到int会导致除法的截断(下降到最接近的int),所以结果几乎总是不同的。

有两个主要区别:

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

  2. 没有人(还)似乎指出了另一个区别 – 如果您的参数大于或等于MAX_INT+1 (或小于-MAX_INT-1 ),然后投射到一个int将导致最高位被丢弃( C,可能)或未定义的行为(C ++和可能的C)。 EG如果你的int是32位的,你只会有一个符号位加上31位的数据。 所以使用这个大的double这将产生意想不到的结果。

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

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

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

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

x >= (int) x如果x >= 0

如果x < 0x < 0 x < (int) x