이것은 단지 내 자신의 호기심을 만족시키기위한 것입니다.
이것의 구현이 있습니까?
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에서 수행 될 것입니다.