c++ 强制转换为整数与下限

iyfamqjs  于 2023-01-22  发布在  其他
关注(0)|答案(6)|浏览(190)

这两者之间有什么区别吗?

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

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

ct3nt3jp

ct3nt3jp1#

强制转换为int将向零截断。floor()将向负无穷截断。如果bar为负,则会给予不同的值。

k2arahey

k2arahey2#

如前所述,对于正数,它们是相同的,但对于负数,它们是不同的。规则是int向0舍入,而floor向负无穷舍入。

floor(4.5) = (int)4.5 = 4
floor(-4.5) = -5 
(int)(-4.5) = -4

话虽如此,在执行时间上还是有区别的。在我的系统上,我计算出施法的速度至少是地面施法的3倍。
我有一段代码需要对有限范围内的值(包括负数)进行floor运算,而且它需要非常高效,所以我们使用下面的函数来实现:

int int_floor(double x) 
{ 
    return (int)(x+100000) - 100000; 
}

当然,对于非常大的x值(你会遇到一些溢出问题)和低于-100000的负值,这将失败,等等。但我已经记录它至少比floor快3倍,这对我们的应用程序非常关键。带着一点盐,在你的系统上测试它,等等。但它值得考虑恕我直言。

a14dhokn

a14dhokn3#

根据www.example.com的差异cppinsights.io

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

// becomes
float foo1 = static_cast<float>(static_cast<int>((static_cast<double>(bar) / 3.0)));
float foo2 = static_cast<float>(floor(static_cast<double>(bar) / 3.0));

// so

bar = 1.0

// gives

foo1 == 0;
foo2 == 0;
ymzxtsji

ymzxtsji4#

编辑:因为问题可能由于fabs()floor()之间的混淆而被修改。
给定原始问题示例行:

1.  float foo = (int)(bar / 3.0);

2.  float foo = fabs(bar / 3.0);

不同之处在于,如果bar为负,则第一个结果为负,而第二个结果为正。第一个结果将被截断为整数,第二个结果将返回包括小数部分的完整小数值。

zbdgwd5y

zbdgwd5y5#

有两个主要区别:
1.正如其他人所指出的,强制转换为整数将向零截断,而floor()将始终向负无穷截断;这对于负操作数是不同的行为。
1.没有人(yet)似乎指出了另一个区别--如果你的参数大于或等于MAX_INT+1(或小于-MAX_INT-1),则强制转换为int将导致丢弃最高位(C,很可能)或未定义的行为(C++和可能的C). EG如果你的int是32位的,你将只有一个符号位加上31位的数据。所以将其与大尺寸的double一起使用将会产生意想不到的结果。

h9a6wy2h

h9a6wy2h6#

(int) x是保留x整数部分的请求(这里没有舍入)
fabs(x) =|x|所以它是>= 0
例如:(int) -3.5返回-3;返回值为3.5;
一般地,fabs (x) >= x对于所有x;
如果x >= 0,则x >= (int) x
如果x < 0,则x < (int) x

相关问题