关于浮点转换的假设:(int)(float)n == n

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位长.但是你可以总是试图用一个重复实验longlong longdouble来代替.

这是一个演示:

#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)

  • @MitchWheat:例如2 ^ 24 + 1. (2认同)
  • @Devolus你怎么做不会做转换?这不是可以优化的不变转换.编译器**必须**这样做. (2认同)
  • @EmanuelePaolini:请记住,IEEE-754浮点数有一个隐含的前导二进制1.所以它是低于2 ^ 24 + 1的所有内容. (2认同)
  • @OliCharlesworth:C标准要求强制转换和赋值将值转换为名义类型; 必须消除过高的精度. (2认同)