Ema*_*ini 3 c ieee-754 floating-point-conversion
我可以假设(int)(float)n == n任何int n?至少我需要这个非负31位值.
附录.怎么样(int)(double)n ==n?
小智 11
不,你不能.对于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位精度,而ints往往最多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;
}
Run Code Online (Sandbox Code Playgroud)
这打印:
n == n: 1
n == (int)(float)n: 0
Run Code Online (Sandbox Code Playgroud)