유리수 타입

나루 위키
둘러보기로 가기 검색하러 가기

유리수 타입(naru core rat)은 a/b 꼴의 유리수를 담을 수 있는 핵심 타입이다. 여기에는 1.234와 같은 소수도 포함되며, 10진법 유한소수 형태로 표현 가능하면 그렇게 출력된다. 이 타입은 임의 정밀도이다.

(1.234 * 2) println() --> 2.468
(1.234 * 5.678) println() --> 7.006652

(1.234 - 0.234) println() --> 1.0 (자연수와 구분하기 위해 소숫점을 항상 표시한다)
(1.17 - 2.195) println() --> -1.025

(1.234 / 3) println() --> 617/1500 (유한소수로 표현 가능하지 않아서 기약분수로 출력)
(13 / 3) println() --> 13/3 (나눗셈 연산자는 항상 유리수를 반환)
(13 / 3 - 1 / 30) println() --> 4.3

논의

부동소숫점 타입은 일반적인 수학 규칙과 다르게 동작하기 때문에 그 규칙에 익숙하지 않은 사용자에게 노출시키는 건 적절치 못하다. 자연수정수가 이미 임의 정밀도이므로 유리수를 임의 정밀도로 하는 것이 추가적인 문제가 되지 않는다는 점도 고려되었다. 이 경우 대체제로 10진수 소수만을 허용할 수도 있고 모든 분수를 허용할 수도 있는데, 후자를 택한 이유는 다음과 같다.

  • 소수 연산은 1/3과 같은 간단한 표현식도 근사치로만 나타낼 수 있다. 유리수는 모든 사칙 연산에 닫혀 있다.
  • 소수 연산에서 근사치를 처리하려면 소숫점 몇 자리까지 계산할지를 런타임 상태에 넣어야 한다. (파이썬의 decimal context를 참고) 유리수 연산은 사칙 연산에 대하여 이러한 상태를 필요로 하지 않는다.

"실수"라는 이름을 사용하지 않는 이유는 어떤 컴퓨터도 계산 불가능한 실수를 지원할 수 없으며, 계산 가능한 실수를 완벽하게 지원하는 것은 가능하긴 하지만 극히 어렵기 때문이다(하스켈 위키 참조).