Ogr*_*amp 108 c c++ floating-point
这些之间有什么区别:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
Run Code Online (Sandbox Code Playgroud)
据我所知,两种情况都有相同的结果.编译代码有什么区别吗?
Jam*_*ran 174
转换为int将截断为零. floor()将截断为负无限.如果bar是负数,这将给你不同的值.
bri*_*men 24
如前所述,对于正数,它们是相同的,但它们的负数不同.规则是int向0舍入,而向下舍入向负无穷大.
floor(4.5) = (int)4.5 = 4
floor(-4.5) = -5
(int)(-4.5) = -4
Run Code Online (Sandbox Code Playgroud)
这就是说,执行时间也存在差异.在我的系统上,我定时铸造至少比地板快3倍.
我的代码需要有限范围的值的底层操作,包括负数.它需要非常高效,因此我们使用以下函数:
int int_floor(double x)
{
return (int)(x+100000) - 100000;
}
Run Code Online (Sandbox Code Playgroud)
当然,对于非常大的x值(你会遇到一些溢出问题)和负值低于-100000等等,这都会失败.但我的时间至少比地板快3倍,这真的很关键我们的应用程序.拿一粒盐,在你的系统上测试等等,但值得考虑恕我直言.
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...
Run Code Online (Sandbox Code Playgroud)