可以假设条件 (int)(i * 1.0f) == i
对于任何整数 i
都是成立的吗?
可以假设条件 (int)(i * 1.0f) == i
对于任何整数 i
都是成立的吗?
不。
如果i
足够大,以至于int(float(i)) != i
(假设float是IEEE-754单精度浮点数,i = 0x1000001
就足以展示这一点),那么这是错误的,因为乘以1.0f
会强制转换成float
,虽然随后的乘法并未改变值,但结果发生了变化。
然而,如果i
是32位整数且double
是IEEE-754双精度浮点数,则int(i*1.0) == i
是正确的。
仅仅为了更加清楚,乘以1.0f
是精确的。可能不准确的是从int
到float
的转换。
i
被转换为float
,这会导致四舍五入。 - Stephen Canona
或b
是NaN,否则a <= b
或a > b
中只有一个为真。 - Eric Postpischilint main() {
int x = 43046721;
float y = x;
printf("%d\n", x);
printf("%f\n", y);
}
43046721
在32位 float
数字中只有24位精度,因此无法正确表示,输出结果大致如下:
43046721
43046720.000000
不,这对于所有整数来说都是绝对错误的,因为进行了类型转换。请检查代码。
#include <stdio.h>
int main()
{
int i = 0;
for (; i < 2147483647; ++i) {
if ((int)(i * 1.0f) != i) {
printf("not equal\n");
break;
}
}
printf("out of the loop\n");
getchar();
return 0;
}
这段代码假设您使用32位整数
double
甚至是long double
或扩展的80位x87浮点数,这种情况下,“不相等”不被打印是合法的。另一个(不太可能的)可能性是float
已经具有至少31位的精度。但是,对于标准IEEE754 32位float
,如果将测试更改为if ((int)((float)i * 1.0f) != i)
,则必须打印“不相等”。 - Daniel Fischer
int
是否会被提升为float
。 - Tony The Lion1.0
是否有任何保证... 可能在IEEE754中答案是“是”。 - Kerrek SB