これは私自身の好奇心を満たすためです。
これの実装はありますか:
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;
}
ルストで?存在する場合は、コードを投稿してください。
私はそれを試して失敗しました。整数形式を使用して浮動小数点数をエンコードする方法がわかりません。これが私の試みです:
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の高速InvSqrt()の起源-ページ1
2. Quakeの高速逆平方根について
3. 高速逆平方根.pdf
4. ソースコード:q_math.c#L552-L572
union
です。
union
。memcpy
冗長ですが、間違いなく動作します。
rsqrtss
およびrsqrtps
命令は、このコードよりも高速で正確です。ARM NEONにはvrsqrte
どちらが似ています。そして、Quake IIIがこれを使用した計算は、いずれにせよ最近のGPUでおそらく行われるでしょう。