반응형

cbrt()란 함수 아시는 분?

 

TinyExpr을 활용하여 계산 기능을 추가하고 보니 2% 부족하다는 생각이 들기 시작했다.

연산자의 종류도 좀 제한적이었고, 함수의 종류도 좀 부족해보였다.

 

뒤져보니 (당연히도) 이걸 발전시킨 프로젝트인 TinyExpr++가 있었다.

 

이 라이브러리는 전체적인 구조는 기존과 거의 같지만 C++로 되어있으며, 인자가 여러 개인 함수도 추가되었다.

심지어 Excel에서 사용되던 함수들도 여럿 도입되었고, 기존의 함수와 Excel의 함수가 모두 있으나 이름이 다른 경우는 둘 다 구현되기도 했다.

 

min(), max(), sum()과 같은 함수들은 인자를 1개에서 7개까지 다양하게 입력받을 수도 있다.

 

코드 수정 방식에 대한 고민 결과

이전 글에서도 썼듯이 처음 구현할 때는 ScintillaWin.cxx 파일을 수정했었다.

선을 넘는 방식같아, 본진에서의 권고에 따라 별도의 액셀러레이터를 생성하여 Notepad2.c에서 실행하도록 구현했다.

 

숫자 자리 구분자(,)의 제거?

이 기능이 구현된 이후 숫자 자리 구분자를 제거[각주:1]해달라는 요청이 있었다.

순정품 TinyExpr에서는 이 기능이 손쉽게 구현 가능했는데, 이미 TinyExpr++ 적용을 진행하고 있었기 때문에 구현이 불가능했다.

TinyExpr은 콤마를 거의 사용하지 않지만[각주:2], TinyExpr++는 콤마를 적극적으로 사용하기 때문이다.

심지어 소숫점 기호나 구분자 기호를 다르게 지정할 수도 있기 때문에 단순히 콤마를 제거하면 오류를 야기하는 원인이 될 것이다.

 

하지만, 다른 각도에서 생각해 보니 괄호 내부에 있는 콤마가 아니라면 그 값은 자리 구분자로 처리할 수 있었다.

즉, max(2,000)은 max()의 인자가 하나인지 둘인지 알 수 없지만, 괄호가 없는 2,000+3,000은 명백히 제거 가능하다.

따라서, 다음 조건을 만족하는 경우에만 콤마(,)를 없애주는 것으로 정리했다.

 

괄호 안의 값이 아닐 것: 즉, sin(pi/2)+2,000 은 처리 가능함

콤마 앞뒤는 모두 숫자가 있어야 하며, 콤마 뒤에는 최소 세 자리 이상이 있을 것

 

Visual C++ x64 컴파일 오류

라이브러리를 적용하여 컴파일해보니 x86에서는 아무런 문제가 없던 것이 x64 Release에서는 컴파일 오류를 일으킨다.

x64 Debug에선 아무 문제 없는데...

오류 위치를 확인하여 원작자에게 리포트했고 수정된 버전이 올라왔다.

 

cbrt() 함수 추가

아는 사람은 아는 함수겠지만... C언어 수학 함수 중에 세제곱근 함수가 있다.

설마하는 생각으로 찾아봤는데, 오히려 있어서 더 깜짝 놀란 함수다.

주변 개발자들에게 물어봐도 다들 pow(n, 1.0/3)을 쓰면 된다고 쿨하게 답하던 함수다.

그래도 이왕 찾은 거 추가해봤다.

구현된 함수들

TinyExpr부터 존재하던 함수/연산자들은 다음과 같다.

일반 함수: abs, ceil, exp, fac, floor, ln, log, log10, ncr, npr, pow, sqrt

삼각 함수: acos, asin, atan, atan2, cos, sin, tan

쌍곡선 함수: cosh, sinh, tanh

연산자: + - * / ^ %

 

TinyExpr++에서 추가된 함수들은 다음과 같다.

일반 함수: and, average, clamp, combin, fact, if, max, min, mod, not, or, permut, power, rand, round, sign, sqr, sum, trunc

  - 이 중 combin, fact, permut, power는 ncr, fac, npr, pow와 동일하며 Excel 이름을 그대로 사용한 것
  - and, average, if, max, min, or는 Excel과 동일한 방식으로 사용됨
  - 앞의 함수들 중 if를 제외한 5개는 최대 7개의 인자까지 처리 가능함

삼각 함수: cot 

연산자: = < <= > >= <> & |

여기에 덧붙여서 앞에서 언급한 cbrt까지 추가되었다.

 

이 외에도 자연대수 e와 원주율 pi를 사용할 수 있다.

 

 

  1. 1,000+2,000=3000 [본문으로]
  2. 사용자 함수를 추가하는 경우에만 사용함 [본문으로]
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band