4. 곱하고, 제곱하고 - 실수 처리 함수들

  • 평범한 한글은 여러 가지 기본 재공 함수를 준비해 두었다. 이를 이용해서 꽤 복잡한 문제를 풀어낼 수 있다.
  • 평범한 한글은 어엿한 함수형 언어이다!
  • 기본 제공 함수들을 여러 가지로 써먹어보면 평범한 한글 방식의 함수 호출에 더 쉽게 익숙해질 수 있다.
  • 재밌게 놀아보자! 😆
 

곱하기와 거듭제곱

  • 곱하기에 관련된 두 개의 함수가 있다.
    • : 인수로 받은 실수를 모두 곱한다. (: 곱하기)
    • : 두 개의 인수를 받아 첫 번째 인수를 두 번째 인수만큼 곱한다. 거듭제곱. (: ?)
      • 이 왜 거듭제곱으로 쓰였는지 언어 명세에는 나오지 않는다. 두 가지를 추죽해 보자면...
        • 예전에 거듭제곱을 "승"이라고 불렀다. "2의 3승" 처럼.
        • 전통적으로 윗점자를 나타낼 때 ^ 기호를 쓰는데 2^3 = 8 이런 식이다. 은 아무래도 ^ 과 비슷해 보인다.
        진실은 저 너머에....

복습: 곱하면서 배우는 함수 호출

ㄷ ㄴ ㄱ ㅎㄷ ㄷ ㄷ ㄱ ㅎㄷ ㄷ ㄹ ㄱ ㅎㄷ ㄷ ㅁ ㄱ ㅎㄷ ㄷ ㅂ ㄱ ㅎㄷ ㄷ ㅅ ㄱ ㅎㄷ ㄷ ㅈ ㄱ ㅎㄷ ㄷ ㄱㄴㄱ ㄱ ㅎㄷ ㄷ ㄴㄴㄱ ㄱ ㅎㄷ
▶️
2 2 6 8 10 12 14 16 18
  • 첫 번째 줄 ㄷ ㄴ ㄱ ㅎㄷ 함수에 2와 1, 두 개의 인수를 넘겨서 함수를 호출한다(ㅎㄷ). 2 * 1 = 2. (여기서는 다른 프로그래밍 언어에서 쓰이는 일반적인 곱하기 연산자인 *을 사용하겠다.)
  • 두 번째 줄은 2 * 2, 세 번째 줄은 2 * 3... 결국 위의 코드는 구구단 중 2단을 계산한다.
 
  • 복잡한 곱하기도 너무 너무 잘 한다.
사과나무 대추나무 큰 호두
▶️
4596060
  • ㅅㄱㄴㅁ 는 10진수로 2118, ㄷㅈㄴㅁ 은 10진수로 2170이니, 2118 * 2170 = 4,596,060 (확실히 곱하기니까 수가 확 커진다.)
  • 인수가 세 개 이상이라도 문제 없다.
ㅈ ㅅ ㅂ ㅁ ㄹ ㄷ ㄴ ㄱ ㅎㅈ
▶️
5040
  • 7!7 * 6 * 5 * 4 * 3 * 2 * 1을 구한다. 결과는 5040. 일곱 개의 인수를 곱하기로 전달하기 위해서 ㄱ ㅎㅈ 를 사용.
구름도 좋고 비도 좋고 눈도 좋고 달도 좋고 별도 좋다니, 캬~ 경회루니까!
▶️
0
  • 평범한 한글의 규칙 중에 '모든 은 그 앞에 공백이 있는 것과 없는 것을 동일하게 취급'하기 때문에 위와 같이 쓸 수 있다. ㄱㅎㄹㄴㄱㄱ ㅎㄹㄴㄱ 는 같은 뜻.
  • 11개(ㄹㄴㄱ)의 인수를 곱하기에 넘겨준다. 마지막 가 0이기 때문에, 앞에 있는 저 단어들이 십진수로 몇인지 계산할 필요가 없어진다.
  • 음화화! 나도 이제 개발자 님처럼 간단히 수렴하는 평범한 한글 포드 짤 수 있다!!!! 🤪
 

신세계를 열어주는 거듭제곱

  • 가장 간단한 것부터 해보자. 2^2 (2의 2제곱)은 어떻게 표현할까?
ㄷ ㄷ ㅅ ㅎㄷ
▶️
4
  • (2)를 두 번 써 준 다음 거듭제곱 함수 이름인 을 쓰고, 두 개의 인수를 전달하면서 함수를 호출하기 위해서 ㅎㄷ를 사용한다. 결과는 4.
ㄷ ㄷ ㅅㅎㄷ ㄷ ㄹ ㅅㅎㄷ ㄷ ㅁ ㅅㅎㄷ ㄷ ㅂ ㅅㅎㄷ ㄷ ㅅ ㅅㅎㄷ ㄷ ㅈ ㅅㅎㄷ ㄷ ㄱㄴㄱ ㅅㅎㄷ ㄷ ㄴㄴㄱ ㅅㅎㄷ ㄷ ㄷㄴㄱ ㅅㅎㄷ ㄷ ㄹㄴㄱ ㅅㅎㄷ ㄷ ㅁㄴㄱ ㅅㅎㄷ ㄷ ㅂㄴㄱ ㅅㅎㄷ ㄷ ㅅㄴㄱ ㅅㅎㄷ ㄷ ㅈㄴㄱ ㅅㅎㄷ ㄷ ㄱㄷㄱ ㅅㅎㄷ
▶️
4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536
  • 전산인이라면 이고 살아야 할 숙명적인 수열. 2의 거듭제곱수.
    • 의 앞에는 공백이 있어도 없어도 같은 결과이기 때문에 특히 기본 제공 함수를 호출할 때는 함수 이름과 호출 단어를 붙이는 것이 보기 편하다.
      • 여러분들도 ㄷ ㅎㄷㄱ ㅎㄷ, ㅅ ㅎㄷ 를 자주 보다보면 ㄷㅎㄷ, ㄱㅎㄷ, ㅅㅎㄷ 가 익숙해질 날이 올 것이다.
  • 이쯤 되면 독특한 짓(?)을 해보고 싶어진다.
ㄷ ㄱ ㅅㅎㄷ ㄷ ㄴㄱ ㅅㅎㄷ ㄷ ㄷㄱ ㅅㅎㄷ
▶️
1 0.5 0.25
  • 오.... 이것이 정녕 가능하다는 말인가? 위의 코드는 다음과 같다.
  • 평범한 한글의 자료형에 실수가 있음을 기억하라! 소수를 나타낼 수 있는 리터럴이 없을 뿐이지 내부에서는 엄연히 실수를 다룰 수 있다.
  • 그런데 거듭제곱이 왜 신세계를 열어줄까? 지금부터 살펴보자.
 

빼기도 나누기도 없는 꼬진(!) 평범한 한글

  • 1980~90년대에 만들어진 컴퓨터 언어는 서로 얼마나 삐까번적한 기능을 할 수 있는지 자랑하곤 하였다. (그래서 C언어가 사람들을 사로잡ㅇ....)
  • 그런데 평범한 한글에는 빼기와 나누기 함수가 없다.그래서 빼기와 나누기를 못한다? ⇒ NO! 😱
  • 어떤 수에 음수를 더하는 것은 양수로 빼는 것과 같다.
ㅈ ㄹㄱ ㄷㅎㄷ
▶️
4
  • 7 - 3을 하려면 7 + (-3) 을 하면 된다. 아... 반칙이라고?
  • 그렇다면 빼려는 수의 부호를 바꾸어서 더하면 빼기가 된다.
ㅈ (ㄹ ㄴㄱ ㄱㅎㄷ) ㄷㅎㄷ
▶️
4
  • 더하기로 빼기를 하라면 7 + (3 * -1) 을 하면 되는 것이다.
💡
이제 슬슬 보이기 시작하는가? ㄱㅎㄷ곱하다로 보이고, ㄷㅎㄷ더하다로 보이면, 여러분은 평범한 한글과 많이 친해진 것이다. 언어의 설계자는 천재임이 틀림 없다. 😳
  • 곱하기와 거듭제곱만 있으면 나누기도 할 수 있다. 어떤 수에 나누려는 수의 역수를 곱하면 된다. 어떤 수를 -1 제곱하면 역수가 된다.
ㅁㄷㄱ (ㅁ ㄴㄱ ㅅㅎㄷ) ㄱㅎㄷ
▶️
5
  • 20 * (4^-1) 로 계산하면 된다. 자, 이래도 평범한 한글이 꼬진가?
  • 심지어 거듭제곱을 이용하면 이런 신통 방통한 것도 할 수 있다.
ㄷ (ㄷ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ ㄹ (ㄷ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ ㅁ (ㄷ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ ㄴㄴㄱ (ㄷ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ ㄱㄷㄱ (ㄷ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ ㄴㄹㄱ (ㄷ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ
▶️
1.4142135623730951 1.7320508075688772 2 3 4 5
  • "왔네 왔네 둘일세", "한 번 치세 이공 다시 한번"을 기억하는가? 위의 코드는 제곱근(루트)을 구한다!
  • 이게 가능한 이유는 다음과 같은 성질 때문이다.
ㄱㄴㄱ (ㄹ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ ㄱㄷㄱ (ㅁ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ ㄱㅁㄱ (ㅂ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ ㄱㄱㄴ (ㅅ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ ㄱㄱㄷ (ㅈ ㄴㄱ ㅅㅎㄷ) ㅅㅎㄷ
▶️
2 2 2 2 2
  • 원한다면 세제곱근, 네제곱근, 다섯제곱근, 여섯제곱근, 일곱제곱근 까지 다 구할 수 있다.
  • 2의 거듭제곱수에 루트를 씌우면 결과값으로 2가 나타난다. 아름답지 않은가!
 
💡
평범한 한글의 언어 명세에 보면 산술 연산이나 논리 연산을 추가할 수 있다는 가능성이 명시되어 있다. 하지만 지금 갖추어 둔 도구만으로도 어지간한 연산은 거뜬히 소화할 수 있도록 꼭 필요한 도루를 제공하고 있다. 언제든 꺼내 쓰면 되는 다른 언어에 비해서 내가 필요한 것을 조립해서 쓰다 보니 마치 어셈블리 언어나 Human Resource Machin 게임을 하는 듯하다. 그래서 평범한 한글은 '난해한' 언어이고, 우리는 이 '난해함'을 즐기면 된다. 😲