转换为int vs floor

时间:2010-07-21 14:26:32

标签: c++ c floating-point

这些之间有什么区别:

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

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

7 个答案:

答案 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)

主要有两点不同:

  1. 正如其他人所指出的那样,转换为整数将截断为零,而floor()将始终截断为负无穷大;对于否定操作数,这是不同的行为。

  2. 似乎还没有人指出另一个区别 - 如果你的论点大于或等于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