float FastInvSqrt(float x) {
float xhalf = 0.5f * x;
int i = *(int*)&x; // evil bit-level floating-point hacking
i = 0x5f3759df - (i >> 1); // what the...?
x = *(float*)&i;
x = x*(1.5f-(xhalf*x*x));
return x;
}
在互联网上有很多地方可以阅读这些内容,但它们都跳过了界限:
int i = *(int*)&x;
有人可以向我解释一下吗?
答案 0 :(得分:2)
这意味着:获取变量x
的地址(无论它是什么类型),将该地址强制转换为int
指针,然后取消引用该地址从该地址获取int
从技术上讲,我认为它是未定义的行为,但它在许多实现中都能正常工作。基于代码的不可读性,我怀疑作者并不是那么关心:-)他们至少可以记录这个方法,即使只有一个URL。
整数操纵线(你用WTF如此优雅地描述的那个)之后的演员与从int
回到float
的情况类似。