시간이 지날수록 기하급수적으로 화가 나는 구체
원문은 Marcin Wichary님이 에 게재했습니다. 이 블로그 구독하기
컴퓨터 과학을 배우다 보면 언젠가 그 기묘한 영광을 온전히 지닌 부동소수점을 마주하게 된다. 부동소수점을 이용하면 엄청나게 크거나 엄청나게 작은 값을 저장할 수 있지만, 그에 따른 기묘한 대가가 따른다. 수는 여전히 정밀도가 제한된 평범한 수일 뿐이지만, 소수점이라는—앞이나 뒤에 0을 몇 개 붙일지를 정하는 또 다른 수—을 달고 다닌다.
실제로 숫자가 수백만 단위가 되면 정밀도는 수천 단위가 된다. 숫자가 수십억 단위가 되면 수백만 단위로만 셀 수 있게 되는 식이다. 억만장자가 잔돈에 신경 쓰지 않는 것과 같은 이치로, 직관적으로 이해할 수 있다. (부동소수점 시각화 도구에 가 보면 9000004와 9000005, 9000006은 문제없이 입력되지만, 0을 하나 더 붙이면 90000004는 90000000으로 내림되고 90000005는 90000008로 올림되는 것을 볼 수 있다. 숫자가 커질수록 정밀도는 더욱 떨어진다.)
이는 비디오 게임이나 그래픽 소프트웨어에서 기묘한 효과를 낳는다. 우주의 원점, 즉 X와 Y가 0인 지점에서 무언가를 멀리 옮길수록 그 내부 정밀도에 대해 더 신경 써야 한다.
현실 세계에서는 문제가 되지 않는다. 아주 작고 정교한 시계 나사 하나를 태양계 너머까지 보냈다가 다시 가져와도 아무 탈 없이 잘 작동할 것이다. 하지만 디지털 세계로 넘어와 지구가 0:0이라고 가정해 보자 — 코페르니쿠스에게는 미안하지만 — 그러면 멀리 갈수록 부동소수점은 왼쪽으로 이동하고, 어느 순간 반대편 숫자의 정밀도가 바닥나 버린다. 수십억 킬로미터를 표현할 수 있는 값이 밀리미터 단위는 고려조차 할 수 없을 만큼 성글어지는 것이다.
아주 흥미로운 문제인데, 이 짧은 영상에서 아주 잘 시각화되어 있다. 일정한 내부 정밀도를 가진 물체를 점점 더 멀리 옮길 때 일어나는 일은 다음과 같다.

이를 우회하는 방법들은 있다 — 정밀도를 높이거나, “플로팅 오프셋”을 도입하거나, 두 개의 부동소수점을 중심으로 두 개의 정밀도 중심을 두는 등 여러 가지를 할 수 있다 — 하지만 각각 대가가 따른다. 그래서 때로는 가장 단순한 해결책이 최선이다. 숫자가 너무 커지지 않도록 막는 것이다.
그래서 무한 캔버스를 약속하는 Adobe Illustrator나 Figma, 그리고 아마 적어도 몇몇 다른 툴들이 사실은 중심에서 너무 멀리 벗어나면 진행을 막는 것이다. 캔버스는 이렇게 말하는 셈이다. 정밀도는 대기 같은 것이어서 멀어질수록 옅어진다고. 일정 지점을 넘어가면 구조적 무결성을 보장할 수 없으니, 애초에 그리로 가지 못하게 하겠다고.
Figma에서는 어느 순간 캔버스가 스크롤 명령을 더 이상 따라오지 않는다.
처음으로 보이지 않게 되는 X 값은 131,072이며, 이 숫자가 매우, 매우 익숙해 보이는 숫자 중 하나라는 것은 놀랍지 않다.
충분히 큰 값처럼 보이지만, 슬라이드 덱에서 슬라이드 하나가 1920×1080이라는 점을 고려하면 처음 생각했던 것만큼 무한하지는 않다. 그리고 이것이 Figma Slides가 20장이 지나면 줄을 바꿔 주는 이유이기도 하다 — 부분적으로는 말이다.
글을 무작위로 읽기
댓글
로그인하고 댓글 남기기