Raku의 base-repeating — 반복 소수부까지 살린 진법 변환

Raku의 base-repeating — 반복 소수부까지 살린 진법 변환

유리수를 십진수로 바꿀 때 1/3같이 소수부가 끝없이 반복되는 경우가 있어요. base-repeating은 그런 반복되는 자리를 따로 분리해서 돌려줘요. 두 개의 문자열이 담긴 목록을 반환하는데, 이 둘을 이어 붙이면 해당 진법에서의 숫자가 돼요. 두 번째 요소가 반복되는 부분이에요.

method base-repeating(Rational:D: Int:D() $base = 10)

출처: Raku 공식 문서 — base-repeating

본문

$base 진법에서의 숫자를 나타내는 두 문자열 목록을 돌려줘요. 두 번째 요소가 반복되는 부분이에요.

my ($non-rep, $repeating) = (19/3).base-repeating(10);
say $non-rep; # OUTPUT: «6.␤»
say $repeating; # OUTPUT: «3␤»
printf '%s(%s)', $non-rep, $repeating; # OUTPUT: «6.(3)»

19/3은 6.333333...으로, 3이 무한히 반복되는 수예요. 그래서 6.3으로 쪼개지고, 이 둘을 합치면 6.(3)처럼 반복 소수 표기로 표현할 수 있어요.

반복이 없으면 두 번째 문자열은 빈 문자열이 돼요.

say (5/2).base-repeating(10).raku; # OUTPUT: «("2.5", "")␤»

한 가지 한계가 있어요. 반복 그룹을 판별하는 정밀도는 1000자로 제한돼요. 그 이상에서는 두 번째 문자열이 ???로 표시돼요. $base의 기본값은 10이에요.