나는 코드 공간을 줄이려고하는 프로젝트를 가지고있다. 우리는 하나의 파일에서 수학 라이브러리에서 pow() 함수를 호출하여이 한 줄의 코드에 대해 마지막 16 진수로 + 12k 코드를 추가합니다. 몇 가지 검색을했는데 수학 라이브러리 외부에서 pow 함수를 수행하는 좋은 방법을 찾지 못하는 것 같습니다. 내가 찾은 모든 예는 수학 라이브러리를 사용하는 것입니다. 최악의 상황은 부동 소수점이 필요하다는 것입니다. 왜냐하면 끊임없이 1.4의 제곱으로 변하는 알려지지 않은 변수를 발생시켜야하고 제어기에 실제로 부동 소수점이 없다는 말을 들었습니다. 부동 소수점이없는 72Mhz 32 비트 ARM 장치 중 일부는 말해서 하나의 라이브러리 기능을위한 거대한 공간입니다. 다른 사람이 이것을 시도하고 전투에서 이겼습니까?자신의 pow() 만들기
1
A
답변
1
this rule on fractional exponents을 사용하여 정수 루트와 정수로 변환 할 수 있습니다.
지수가 고정되어 있기 때문에 1.4 = 7/5
부터 코드를 훨씬 간단하게 만들 수 있습니다. 이제 정수 입력에서이 두 단계를 정확히 수행하는 단일 함수를 작성하면 부동 소수점 계산이 손실되지 않습니다.
0
당신은 적은 코드가 float
대신 double
및 powf()
을 사용하여 멀리 얻을 수 있습니다 :
float var=0.12345f;
var=powf(var,1.4f);
물론, 결과는 덜 정확합니다.
1
지수가 고정되어 있기 때문에 일반 pow() 함수를 작성하는 것보다 문제가 다소 간단합니다. 모든 기능을 갖춘 pow()의 정밀도 요구 사항 을 완화 할 수도 있습니다.
옵션 1 : f (x) = x^1.4에 대해 Taylor Series 확장을 구현합니다. 은 Taylor 시리즈를 확장하기 위해 x의 값을 선택해야하며, 은 x가이 값에서 멀어 질수록 정밀도를 잃을 것입니다.
옵션 2 : 일부 점 수에서 x^1.4의 값을 표로 작성한 다음 중간 점에서 값을 계산하려면 선형 (또는 더 높은 차수 다항식) 보간법을 사용하십시오.
Duh .. 분명히 항상 나를 잡습니다. 이걸 읽고 여기에 오는 사람들은 위키 피 디아에 도착하여 "n 번째 루트 알고리즘"을 검색합니다.이 방정식의 후반부는 아주 잘 설명되어 있습니다. 이것은 또한 여러분이 가진 불규칙한 sqrt() 호출을 제거하는데 사용될 수 있습니다. 이 두 가지 모두를 사용하여 많은 불필요한 코드를 제거하지만 완료 될 때 얼마나 올라갈 지 확신하지 못합니다. 나는 이것을 며칠 동안 코딩하지 않을 것이다. – user1054210