이것은 단지 내 자신의 호기심을 만족시키기위한 것입니다.
이것의 구현이 있습니까?
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. FAST INVERSE SQUARE ROOT.pdf
4. 소스 코드 : q_math.c # L552-L572
union.
union작동 하지 않는다고 생각 합니다. memcpy장황하지만 확실히 작동합니다.
rsqrtss및 rsqrtps명령어는이 코드보다 빠르고 정확합니다. ARM NEON vrsqrte과 비슷한 기능이 있습니다. 그리고 Quake III가 이것을 사용한 계산은 아마도 요즘 GPU에서 수행 될 것입니다.