这个C成语是什么意思?

这个C成语是什么意思?,c,math,floating-point,newtons-method,C,Math,Floating Point,Newtons Method,可能重复: 我最近在博客上看到了这段代码——它来自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

可能重复:

我最近在博客上看到了这段代码——它来自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;相反,它给出了一个完全不同的结果。

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

int i=*int*&x;不将x转换为int-它所做的是获取浮点x的实际位,它通常表示为一个完整的4字节值


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

以i结尾的数字是x中数字的浮点表示形式的二进制值。这个链接解释了这是什么样子。这不是一个常见的C习惯用法,它是在SSE指令被添加到商用x86处理器之前的一个聪明的技巧。

我很确定这在C程序员中不是一个习惯用法。将浮点转换为int与取消引用将浮点指针转换为int指针完全不同。此外,这种方法比rsqrtss x86指令慢得多,精度也低得多。我认为这不是真正的重复,因为它询问的是*int*&x,而不是魔法常数0x5f3759df,后者是另一个问题的主要焦点。诚然,这种方法比使用SSE rsqrt更慢、更不准确,但代码是在游戏玩家可以依赖SSE进入处理器之前编写的。这是一个更糟糕的想法,因为重新解释会调用未定义的行为,现代编译器编写者喜欢将其优化掉。