这两者之间有什么区别吗?
float foo1 = (int)(bar / 3.0); float foo2 = floor(bar / 3.0);
据我所知,这两种情况有相同的结果。编译的代码有什么不同吗?
ct3nt3jp1#
强制转换为int将向零截断。floor()将向负无穷截断。如果bar为负,则会给予不同的值。
floor()
bar
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倍,这对我们的应用程序非常关键。带着一点盐,在你的系统上测试它,等等。但它值得考虑恕我直言。
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;
ymzxtsji4#
编辑:因为问题可能由于fabs()和floor()之间的混淆而被修改。给定原始问题示例行:
fabs()
1. float foo = (int)(bar / 3.0); 2. float foo = fabs(bar / 3.0);
不同之处在于,如果bar为负,则第一个结果为负,而第二个结果为正。第一个结果将被截断为整数,第二个结果将返回包括小数部分的完整小数值。
zbdgwd5y5#
有两个主要区别:1.正如其他人所指出的,强制转换为整数将向零截断,而floor()将始终向负无穷截断;这对于负操作数是不同的行为。1.没有人(yet)似乎指出了另一个区别--如果你的参数大于或等于MAX_INT+1(或小于-MAX_INT-1),则强制转换为int将导致丢弃最高位(C,很可能)或未定义的行为(C++和可能的C). EG如果你的int是32位的,你将只有一个符号位加上31位的数据。所以将其与大尺寸的double一起使用将会产生意想不到的结果。
MAX_INT+1
-MAX_INT-1
int
double
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
(int) x
x
fabs(x)
>= 0
(int) -3.5
-3
3.5
fabs (x) >= x
x >= 0
x >= (int) x
x < 0
x < (int) x
6条答案
按热度按时间ct3nt3jp1#
强制转换为int将向零截断。
floor()
将向负无穷截断。如果bar
为负,则会给予不同的值。k2arahey2#
如前所述,对于正数,它们是相同的,但对于负数,它们是不同的。规则是int向0舍入,而floor向负无穷舍入。
话虽如此,在执行时间上还是有区别的。在我的系统上,我计算出施法的速度至少是地面施法的3倍。
我有一段代码需要对有限范围内的值(包括负数)进行floor运算,而且它需要非常高效,所以我们使用下面的函数来实现:
当然,对于非常大的x值(你会遇到一些溢出问题)和低于-100000的负值,这将失败,等等。但我已经记录它至少比floor快3倍,这对我们的应用程序非常关键。带着一点盐,在你的系统上测试它,等等。但它值得考虑恕我直言。
a14dhokn3#
根据www.example.com的差异cppinsights.io
ymzxtsji4#
编辑:因为问题可能由于
fabs()
和floor()
之间的混淆而被修改。给定原始问题示例行:
不同之处在于,如果bar为负,则第一个结果为负,而第二个结果为正。第一个结果将被截断为整数,第二个结果将返回包括小数部分的完整小数值。
zbdgwd5y5#
有两个主要区别:
1.正如其他人所指出的,强制转换为整数将向零截断,而
floor()
将始终向负无穷截断;这对于负操作数是不同的行为。1.没有人(yet)似乎指出了另一个区别--如果你的参数大于或等于
MAX_INT+1
(或小于-MAX_INT-1
),则强制转换为int
将导致丢弃最高位(C,很可能)或未定义的行为(C++和可能的C). EG如果你的int
是32位的,你将只有一个符号位加上31位的数据。所以将其与大尺寸的double
一起使用将会产生意想不到的结果。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