我可以假设 (int)(float)n == n
对任何 int n
吗?至少对于非负的 31 位值我需要这个。
附录。 (int)(double)n ==n
呢?
最佳答案
不,你不能。对于不能用 float
精确表示的 int
,这将失败。
(原因:float
一般是一个32位的IEEE-754浮点值,只有24位精度,其余的留给指数和符号。所以如果你的整数比 23 有更多的有效二进制数字,并且它不是 2 的适当幂的倍数,那么它不能精确地表示为 float
。)
addendum. What about (int)(double)n ==n?
是一样的。对于不能表示为 double
的 int
,比较不会总是产生 true。然而,一般来说,int
的长度不足以实现这一点——广泛接受的 double
实现是一个 64 位 IEEE-754 float ,它有 53位精度,而 int
往往最多 32 位长。但您始终可以尝试使用 long
或 long long
和 double
来重复实验。
这是一个演示:
#include <stdio.h>
int main()
{
int n = (1 << 24) + 1;
printf("n == n: %d\n" , n == n);
printf("n == (int)(float)n: %d\n", n == (int)(float)n);
return 0;
}
这打印:
n == n: 1
n == (int)(float)n: 0
关于c - 浮点转换假设 : (int)(float)n == n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20900313/