-1

可能重复:
John Carmack 不寻常的快速反平方根 (Quake III)

我最近在博客上看到了这段代码——它来自 Quake3 引擎。它旨在使用 Newton-Rhapson 方法快速计算平方根倒数。

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;会产生完全不同的结果。

4

3 回答 3

7

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

于 2010-08-10T19:03:39.607 回答
7

int i = *(int*)&x;不会转换x为 int —— 它所做的是获取float的实际x,通常表示为比您预期的其他 4 字节值。

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

于 2010-08-10T19:04:38.703 回答
2

最终的数字是 x 中数字的IEEE浮点表示i的二进制值。该链接解释了它的外观。这不是一个常见的 C 习惯用法,它是在将 SSE 指令添加到商用 x86 处理器之前的一个巧妙技巧。

于 2010-08-10T19:26:50.040 回答