C 浮点转换的假设:(int)(float)n==n
对于任何C 浮点转换的假设:(int)(float)n==n,c,ieee-754,floating-point-conversion,C,Ieee 754,Floating Point Conversion,对于任何intn,我可以假设(int)(float)n==n?至少对于非负的31位值我需要这个 补遗。关于(int)(double)n==n?不,你不能。对于不能用float精确表示的ints,此操作将失败 (原因:float通常是一个32位IEEE-754浮点值。它只有24位精度,其余的保留给指数和符号。因此,如果整数的有效二进制位数大于23位,并且不是2的适当幂的倍数,那么它就不能精确地表示为整数。)float) 补遗,(int)(double)n==n呢 这是一样的。对于不能表示为doub
intn
,我可以假设(int)(float)n==n
?至少对于非负的31位值我需要这个
补遗。关于
(int)(double)n==n
?不,你不能。对于不能用float
精确表示的int
s,此操作将失败
(原因:float
通常是一个32位IEEE-754浮点值。它只有24位精度,其余的保留给指数和符号。因此,如果整数的有效二进制位数大于23位,并且不是2的适当幂的倍数,那么它就不能精确地表示为整数。)float
)
补遗,(int)(double)n==n呢
这是一样的。对于不能表示为double
的int
s,比较结果并不总是正确的。但是,一般来说,int
的长度不足以实现这一点-double
的广泛接受的实现是一个64位的IEEE-754浮点数,具有53位的精度,其中sint
s的长度通常最多为32位。但您可以尝试使用long
或long
和双精度
重复该实验
下面是一个演示:
#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已经是int,为什么要强制转换?我的int会进入一个浮点数组进行计算。我建议你试试这个程序:@haccks为什么不编译?非常密切相关的问题:我很好奇;哪些int不能表示为浮点?那些超出范围?@MitchWheat:例如,2^24+1.@Devolus你怎么做它不会进行转换?这s不是可以优化掉的不变转换。编译器必须这样做。@EmanuelePaolini:请记住IEEE-754浮点值有一个隐式的前导二进制1。所以它是2^24+1以下的所有值。@OliCharlesworth:C标准要求强制转换和赋值将值转换为标称类型;多余的精度必须为elimina特德。
n == n: 1
n == (int)(float)n: 0