这些之间有什么区别:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
据我了解,两种情况都有相同的结果。编译后的代码有什么区别吗?
#include<cmath>
使用C ++ 并使用std::floor
)
bar
?
这些之间有什么区别:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
据我了解,两种情况都有相同的结果。编译后的代码有什么区别吗?
#include<cmath>
使用C ++ 并使用std::floor
)
bar
?
Answers:
强制转换为int将截断为零。 floor()
将截断为负无穷大。如果bar
为负,这将为您提供不同的值。
floor()
是目的,则另一个不同是如果的值bar
太大而不能放入int
。
如前所述,对于正数,它们是相同的,但是对于负数,它们是不同的。规则是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倍,这非常关键为我们的应用程序。带着一粒盐,在您的系统上测试它,等等。但是值得考虑恕我直言。
float
,不是double
-也许double
是您的应用程序。如果在C中,请确保floorf()
与float
s 一起使用。
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...
fabs
?问题是关于floor
。...的地板0.33333
是0
。
有两个主要区别:
正如其他人指出的那样,强制转换为整数将截断为零,而floor()
始终将截断为负无穷大。对于负操作数,这是不同的行为。
似乎还没有人指出另一种差异-如果您的论点大于或等于MAX_INT+1
(或小于-MAX_INT-1
),则强制转换为int
会导致最高位被丢弃(可能是C)或未定义的行为( C ++,也可能是C)。EG如果您int
是32位,则只有符号位加上31位数据。因此,将其与double
较大的尺寸一起使用会产生意想不到的结果。
int
溢出的确切条件是该参数大于或等于INT_MAX
+1。对称地,下溢的条件是参数小于或等于INT_MIN
-1。
(int) x
是一个要求保留整数部分的请求 x
(此处没有舍入)
fabs(x)
= | x | 所以它是>= 0
;
例如:(int) -3.5
退货-3
;fabs(-3.5)
回报3.5
;
通常,
fabs (x) >= x
对于所有x;
x >= (int) x
如果 x >= 0
x < (int) x
如果 x < 0
floor
,但是请注意这double
不是为了float
。C99还具有floorf
对float
。