这只是为了满足我的好奇心。
这个有没有实现:
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;
}
在 Rust 中有吗?如果有,请发代码。
我尝试了但失败了。我不知道如何使用整数格式编码浮点数。这是我尝试的代码:
fn main() {
println!("Hello, world!");
println!("sqrt1: {}, ",sqrt2(100f64));
}
fn sqrt1(x: f64) -> f64 {
x.sqrt()
}
fn sqrt2(x: f64) -> f64 {
let mut x = x;
let xhalf = 0.5*x;
let mut i = x as i64;
println!("sqrt1: {}, ", i);
i = 0x5f375a86 as i64 - (i>>1);
x = i as f64;
x = x*(1.5f64 - xhalf*x*x);
1.0/x
}
参考资料:
1. Quake3的Fast InvSqrt()起源 - 第1页
2. 理解Quake的快速倒数平方根
3. 快速倒数平方根.pdf
4. 源代码:q_math.c#L552-L572
union
也行。memcpy
绝对可以,尽管它很冗长。 - Matthieu M.rsqrtss
和rsqrtps
指令比这段代码更快、更准确。ARM NEON有一个类似的指令叫做vrsqrte
。而Quake III所使用的任何计算,现在可能都会在GPU上执行。 - benrg