这些之间有什么区别:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
据我所知,两种情况都有相同的结果。编译代码有什么不同吗?
答案 0 :(得分:167)
转换为int将截断为零。 floor()
将截断为负无穷大。如果bar
为负数,则会为您提供不同的值。
答案 1 :(得分:24)
如前所述,对于正数,它们是相同的,但它们的负数不同。规则是int向0舍入,而向下舍入为负无穷大。
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倍,对我们的应用程序非常关键。拿一粒盐,在你的系统上测试等等,但值得考虑恕我直言。
答案 2 :(得分:8)
SO 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...
答案 3 :(得分:4)
编辑:由于fabs()
和floor()
之间的混淆,问题可能已被修改。
给出原始问题示例行:
1. float foo = (int)(bar / 3.0);
2. float foo = fabs(bar / 3.0);
不同之处在于,如果bar为负数,则第一个结果为负数,第二个结果为正数。第一个将被截断为整数,第二个将返回完整的十进制值,包括小数部分。
答案 4 :(得分:3)
是。 fabs
返回其参数的绝对值,而转换为int会导致除法的截断(向下到最近的int),因此结果几乎总是不同。
答案 5 :(得分:2)
主要有两点不同:
正如其他人所指出的那样,转换为整数将截断为零,而floor()
将始终截断为负无穷大;对于否定操作数,这是不同的行为。
似乎还没有人指出另一个区别 - 如果你的论点大于或等于MAX_INT+1
(或小于-MAX_INT-1
),那么就转换为{{1将导致最顶端的位被删除(可能是C)或未定义的行为(C ++和可能的C)。 EG如果int
为32位,则只有符号位加31位数据。因此,使用尺寸较大的int
会产生意想不到的结果。
答案 6 :(得分:0)
(int) x
是保留x
的整数部分的请求(此处没有舍入)
fabs(x)
= | x |所以它是>= 0
;
例如:(int) -3.5
返回-3
; fabs(-3.5)
返回3.5
;
一般来说,
所有x都fabs (x) >= x
;
x >= (int) x
,请 x >= 0
如果x < (int) x
x < 0