投到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),所以结果几乎总是不同的。
有两个主要区别:
-
正如其他人所指出的,投射到一个整数将被截断为零,而
floor()
将总是被截断为负的无穷大。 这是负操作数的不同行为。 -
没有人(还)似乎指出了另一个区别 – 如果您的参数大于或等于
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 < 0
则x < 0
x < (int) x