我可以假设(int)(float)n == n
任何int n
吗?至少我需要这个用于非负的 31 位值。
附录。怎么样(int)(double)n ==n
?
我可以假设(int)(float)n == n
任何int n
吗?至少我需要这个用于非负的 31 位值。
附录。怎么样(int)(double)n ==n
?
不,你不能。对于int
不能由 a 精确表示的 s float
,这将失败。
(原因:float
通常是一个 32 位 IEEE-754 浮点值。它只有 24 位精度,其余的保留给指数和符号。所以如果你的整数有比 23 更多的有效二进制数字,并且它不会恰好是适当的 2 次幂的倍数,那么它就不能精确地表示为 a float
。)
附录。那么 (int)(double)n ==n 呢?
一样的。对于int
不能表示为 a 的 s,double
比较不会总是产生真值。然而,一般来说,int
不足以实现这一点——被广泛接受的实现double
是一个 64 位 IEEE-754 浮点数,它具有 53 位精度,而int
s 往往最多 32 位长。但是你总是可以尝试用 along
或 along long
和 a来重复实验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