반응형

발단은 한 줄의 댓글이었다.

 

메모장2가 계산기를?

 

처음엔 이거 웬 엉뚱한 얘긴가 했는데, 생각해볼수록 흥미가 생기는 주제였다.

회사에서 일하면서 메모장에 내용을 기록하다가 계산하기 위해 계산기를 띄우는 일은 자주 벌어지기 때문이었다.

 

일단은 깃헙의 Notepad2-mod 리파지토리 쪽에 이 기능에 대해 의견을 물어봤다.

그런데, 놀랍게도 이미 그러한 프로젝트가 깃헙에 있다는 답글이 올라왔다.

심지어 이 프로그램은 TortoiseGit에서 사용되고 있었다[각주:1].

 

하지만, 여기서 사용한 방식은 내가 원하는 스타일은 아니었다.

수식을 입력하면 상태표시줄에 계산결과를 보여주는 방식이었는데, 나는 결과를 문서에 포함시키고 싶었다.

 

이 프로그램에서 사용하는 라이브러리는 TinyExpr인데, 이것만 적절히 적용하면 수식을 해석하는 부분은 손쉽게 만들 수 있었다.

 


 

하지만, 막상 구현하고 보니 고민을 더 해야 할 지점들만 도출되었다.

 

코드 수정 방식에 대한 고민

Notepad2 프로젝트Scintilla 라이브러리에 기반한 프로젝트이다.

전체적으로 메모장의 기능은 Notepad2 쪽에서, 텍스트 편집기 자체에 대한 근본적 기능은 Scintilla에서 수행한다.

즉, 메모장 자체의 기능에 손을 대려면 Notepad2 쪽을 수정하는 것이 더 적절한 것이다.

 

하지만, 나는 Ctrl+Enter를 누르면 식을 계산하도록 하기를 원했고, 그러려면 오로지 Scintilla 쪽만 수정해야 되는 것이다.

정확히는 ScintillaWin.cxx 파일 하나만 수정했다.

 

이 방식이 올바른 접근법인지를 모르겠다.

 

소수점 표시 자릿수에 대한 고민

잘 알려져있다시피, C/C++ 언어의 수학 계산 라이브러리들은 IEEE754 범위에서만 동작한다.

어떻게 계산을 하든 어느 순간에는 절삭이 발생할 수밖에 없다는 뜻이다.

\(cos({\pi \div 3})\)을 계산하면 \(0.5\)가 나오지 않고, \(0.500000000000000111\)이 나온다.

 

이 결과를 자연스럽게 보여주려면 유효숫자를 몇 자리까지 보여줘야 하는지를 고민해야 된다.

기본값인 6자리는 너무 많은 것을 숨기는 느낌이 들었고, 15자리를 넘어가면 삼각함수는 대체로 애매한 결과를 보여준다.

일단은 14자리로 구현해두었다.

이 부분은 계속 사용하면서 보강이 필요할 것 같다.

 

지원되는 함수의 종류나 진법 변환 등에 대한 고민

TinyExpr은 대단히 훌륭한 라이브러리지만, 약간 애매한 한계들이 있다.

일단, 지원되는 함수의 종류가 너무 적고, 비표준 C언어 구문을 적용한 다소 위험한(?) 구조를 가지고 있다.

Notepad2e에 적용된 버전은 다양한 진법을 인식하도록 수정됐는데, 순정품은 10진수와 16진수밖에 해석하지 못한다.

이 라이브러리 자체를 직접 개선하거나, 개선된 라이브러리를 찾아서 적용하는 방안에 대한 고민이 더 필요해보인다.

 

어쨌거나 기본적인 함수들을 꽤 많이, 그리고 잘 지원하는 헌재 버전!!

 

 

  1. 따라서 이 프로그램은 내 회사 PC엔 이미 설치가 되어있었음 [본문으로]
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band