代码之家  ›  专栏  ›  技术社区  ›  Omair

这个C成语是什么意思?[复制品]

  •  0
  • Omair  · 技术社区  · 14 年前

    可能重复:
    John Carmack’s Unusual Fast Inverse Square Root (Quake III)

    我最近在博客上看到了这段代码——它来自Quake3引擎。它的目的是用牛顿-李逊法快速计算平方反比。

    float InvSqrt (float x){
        float xhalf = 0.5f*x;
        int i = *(int*)&x;
        i = 0x5f3759df - (i>>1);
        x = *(float*)&i;
        x = x*(1.5f - xhalf*x*x);
        return x;
    }
    

    为什么要这样做 int i = *(int*)&x; ?做 int i = (int) x; 相反,结果完全不同。

    3 回复  |  直到 14 年前
        1
  •  7
  •   cHao    14 年前

    int i = *(int*)&x; 不转换 x 对一个整数——它的作用是得到 浮动的 X ,通常表示为一个整体,而不是您预期的4字节值。

    作为参考,这样做是一个非常糟糕的主意,除非您确切地知道在内存中如何表示浮点值。

        2
  •  7
  •   James Curran    14 年前

    int i = *(int*)&x; 表示“取组成浮点值x的四个字节,并将其视为int。”浮点值和int值使用完全不同的方法存储(例如,int 4和float 4.0具有完全不同的位模式)。

        3
  •  2
  •   nmichaels    14 年前

    最后出现的数字 i 是的二进制值 IEEE 以x表示的数字的浮点表示。链接解释了这是什么样子。这不是一个常见的C习语,这是一个巧妙的技巧,从SSE指令添加到商用x86处理器之前。