일부 C 가 실현 한 수학 함수 실현 (추산)
표준 라 이브 러 리 의 함수 80% 는 체크 표 법 을 사용 하고 표 가 너무 클 수 있 으 며 나 는 표준 라 이브 러 리 의 실현 코드 를 보 러 가지 않 았 다.그럼 제 가 실현 한 함수 와 표준 라 이브 러 리 의 차 이 는 무엇 입 니까?사실은 용량 이 작 지만 오차 가 좀 크 지만 제 응용 에서 소수점 몇 자리 후의 오 차 는 대체적으로 무시 할 수 있 습 니 다.
0. Sqrt (제곱 근) 와 RSqrt 함수 (제곱 근 역수) 실현
#include <stdint.h>
typedef union{
float f;
int32_t i;
}FIUnion;
float RSqrt(float value){
size_t i;
FIUnion buffer;
buffer.f = value;
buffer.i = 0x5f3759df - (buffer.i >> 1);
for(i = 0;i != 4;++i)
buffer.f *= (3.0f - value*buffer.f*buffer.f)*0.5f;
return buffer.f;
}
float Sqrt(float value){
return 1.0f / RSqrt(value);
} 이 알고리즘 은 (Hacker 's Delight) 에서' 17.4 추산 제곱 근 '에 언급 되 었 고 인터넷 에서 카 마크 에 관 한 전설 에 도 있 으 며 대체적으로 뉴턴 법 에서 변 화 된 알고리즘 으로 이해 할 수 있다.이 예 는 네 번 의 교 체 를 했 는데 정밀도 가 괜 찮 고 너무 많은 교 체 를 해서 단편 기 는 참 을 수 없다.
1. CORDIC (좌표 회전 디지털 계산 방법) 를 통 해 역 삼각함수 구하 기
#include <stddef.h>
#define MPI 3141593//π*1000000
#define MUL 0.000001f//
#define NUM 21
float ATan2(float y,float x){
static const int radin[NUM] = {
785398, 463648, 244979, 124355,
62419, 31240, 15624, 7812,
3906, 1953, 977, 488,
244, 122, 61, 31,
15, 8, 4, 2, 1};
size_t i;
int tx,ty;
int ix = x*1024.0f,iy = y*1024.0f;
int result = 0;
if(ix < 0){
result = iy >= 0 ? MPI : -MPI;
ix = -ix;
iy = -iy;
}
for(i = 0;i != NUM;++i){
if(iy == 0)break;
if(iy > 0){
tx = ix + (iy >> i);
ty = iy - (ix >> i);
result += radin[i];
}else{
tx = ix - (iy >> i);
ty = iy + (ix >> i);
result -= radin[i];
}
ix = tx;
iy = ty;
}
return result * MUL;
}
float ASin(float value){
float y = value;
float x = 1.0f / RSqrt(1.0f - y*y);
return ATan2(y,x);
}
float ACos(float value){
float x = value;
float y = 1.0f / RSqrt(1.0f - x*x);
return ATan2(y,x);
}
float ATan(float value){
return ATan2(value,1.0f);
} 여기 에는 위의 예 에서 RSqt 를 사 용 했 습 니 다. ASin 과 ACos 에 사 용 됩 니 다.먼저 ATan 2 를 말 해 보 세 요. 사실은 '대 변' 과 '이웃 변' 의 길이 가 들 어 오 는 것 입 니 다. 그러면 한 좌표계 에서 우 리 는 이 각 을 벡터 ('대 변', '이웃 변') 와 X 정 반 축의 협각 이 라 고 생각 할 수 있 습 니 다.구 해 를 하 는 과정 도 한 걸음 한 걸음 다가 와 비슷 한 평 가 를 받 았 다.
기본 적 인 사고: 먼저 이 변 을 14 상한 까지 회전 시 키 고 회전 하 는 각 도 를 누적 하 는 것 이다.그 다음 에 끊임없이 회전 하여 X 정 반 축 에 가 깝 게 하고 누적 회전 하 는 각도 이다.
radin 배열 은 tan 값 이 1, 1 / 2, 1 / 4.정수 로 부동 소수점 계산 을 줄 일 수 있 고 의도 적 으로 1000000 배 를 써 서 소수점 뒤의 몇 자 리 를 수용 할 수 있다. 왜냐하면 사용 하 는 라디안 수 치 는 기본적으로 1 보다 작 기 때문이다.마지막 으로 결 과 를 0.00001 로 곱 했다.
tx = ix + (iy > > i);ty = iy - (ix >> i);이것 은 좌표 가 회전 하 는 변체 (x '/ cos = x + y * tan, y' / cos = y - x * tan) 로 벡터 의 길 이 를 무시 하고 cos 로 나 누 어 계산 을 줄인다.회전 하 는 각 은 특별히 tan 을 1, 1 / 2, 1 / 4 로 선택 하기 때문에 2 를 제외 한 i 차방 에 해당 하 며, 이러한 2 를 제외 한 차방 은 오른쪽으로 대체 할 수 있다.
마지막 ATan 은 tan = y / x ('맞 아' 는 '임' 을 제외 하고) 이기 때문에 X = 1 시 Y = tan 이 되 었 기 때문에 바로 이렇게 사용 합 니 다.쓸 때 이런 생각 을 했 어 요. 단점 이 있 으 면 ATan 2 보다 오차 가 더 클 거 예요.그것 도 ATan 2 를 호출 했 기 때문에 성능 도 떨 어 졌 다.
총결산
모두 추산 알고리즘 이지 만 많은 자원 을 절약 했다. 특히 싱글 칩 마이크로컴퓨터 가 힘 을 주지 않 는 상황 에서.이것들 은 이미 오래전 에 싱글 칩 마이크로컴퓨터 를 만 들 때 쓴 것 이다. 그 당시 에 쓸 때 최적화 하기 위해 많은 방법 을 생각 했 기 때문에 코드 안의 일부 코드 는 좀 이상 할 수 있다 (예 를 들 어 1000000 배, 그 강제 X = 1 등).
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.