옛날에 한 왕자의 목숨을 구한 지혜로운 신하가 있었어요. 왕은 신하가 원하는 것이 무엇이든 주겠다고 약속했어요. 왕이 체스를 좋아한다는 것을 알고, 신하는 밀알을 갖고 싶다고 왕에게 말했어요. 체스판의 첫 번째 칸에는 한 알, 그다음 칸부터는 알의 수를 두 배씩 늘려서요.
체스판에 놓인 밀알의 개수를 계산해요.
체스판은 64개의 칸으로 이루어져 있어요. 1번 칸에는 밀알이 한 개, 2번 칸에는 두 개, 3번 칸에는 네 개가 놓이고, 그다음부터는 칸마다 두 배씩 늘어나요.
다음을 계산하는 코드를 작성해 봐요:
Euphoria에서 atom은 모든 종류의 숫자를 담을 수 있고, integer라는 하위 타입은 정수를 위한 것이에요.
C 같은 언어에서는 부호 없는 64비트 정수를 반환해서 이 연습 문제를 풀 수 있어요.
하지만 Euphoria의 정수는 부호가 있고 머신 워드보다 1비트 작아서, 이 연습 문제를 풀기에는 너무 작아요. 반면 atom은 필요한 64비트 정밀도로 더 큰 정수를 담을 수 있어요.
Euphoria에는 32비트 버전도 있는데, 이는 64비트 버전이 없거나 그런 것을 감싼 래퍼가 하드코딩된 32비트 오프셋으로 가득한 경우에 레거시 애플리케이션이 미리 빌드된 32비트 dll/so를 계속 사용할 수 있도록 남아 있어요. 이 버전은 이 과제를 풀기에 전혀 충분하지 않아요. 그 버전의 atom은 정밀도가 53비트밖에 안 되니까요. 이 연습 문제를 로컬에서 푸는 데 어려움을 겪고 있다면, 64비트 버전의 Euphoria를 사용하고 있는지 확인해 봐요.