처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.04.26 30

VAX의 부동소수점은 왜 그렇게 까다로웠나 - OpenBSD 포팅 비화

Hacker News 원문 보기

40년 전 컴퓨터를 아직도 살리는 사람들

혹시 VAX라는 컴퓨터 들어보셨어요? 1977년에 DEC(디지털 이큅먼트 코퍼레이션)이라는 회사가 만든 미니컴퓨터인데요, 당시에는 대학교 전산실이나 기업 연구소의 핵심 장비였어요. 그런데 놀라운 건, OpenBSD라는 운영체제 프로젝트는 지금도 이 VAX를 공식적으로 지원하고 있다는 거예요. 박물관에나 있을 법한 기계를 왜 굳이 신경 쓰냐고요? 그게 바로 OpenBSD의 철학이거든요. "오래된 하드웨어에서도 잘 돌아가야, 코드가 정말 이식성 있는 코드다"라고 보는 거죠.

이번에 소개할 글은 OpenBSD 개발자 Miod Vallat이 VAX 부동소수점 연산을 다루면서 겪은 이야기인데요, 단순히 "옛날 얘기"가 아니라 컴퓨터 과학의 역사와 표준이 어떻게 만들어졌는지를 보여주는 흥미로운 기록이에요.

부동소수점이라는 골치 아픈 녀석

먼저 부동소수점(floating point)이 뭔지 잠깐 설명할게요. 컴퓨터에서 3.14 같은 소수를 표현하려면 정수와는 다른 방식이 필요해요. 그래서 "가수(소수 부분)"와 "지수(크기)"를 따로 저장하는 방식을 쓰는데, 이게 부동소수점이에요. 마치 과학에서 1.23 × 10^5 라고 쓰는 것처럼요.

오늘날 우리가 쓰는 거의 모든 컴퓨터는 IEEE 754라는 표준을 따라요. 1985년에 만들어진 이 표준 덕분에 인텔 CPU에서 계산한 결과와 ARM CPU에서 계산한 결과가 똑같이 나오죠. 그런데 VAX는 IEEE 754 이전에 만들어진 기계예요. 그래서 자기들만의 독자적인 부동소수점 포맷을 가지고 있어요. F_floating, D_floating, G_floating, H_floating 같은 이름으로 4가지나 되는 형식이 있어요.

특히 재미있는 건 비트 배열 순서예요. VAX는 16비트 워드 단위로 데이터를 저장하는데, 한 부동소수점 값 안에서도 워드 순서가 뒤죽박죽이에요. 우리가 흔히 말하는 빅 엔디안이나 리틀 엔디안 같은 단순한 규칙이 아니라, "미들 엔디안"이라고 부를 정도로 독특한 배치를 가지고 있어요. 이걸 현대적인 컴파일러로 다루려면 꽤 골치가 아프죠.

왜 이게 어려운 문제일까

OpenBSD가 VAX를 지원한다는 건, gcc 같은 컴파일러도 VAX용 코드를 생성할 수 있어야 한다는 뜻이에요. 그런데 gcc는 내부적으로 IEEE 754 방식으로 부동소수점 상수를 처리해요. 컴파일 타임에 "3.14"라는 값을 만나면, 이걸 IEEE 754 형식으로 메모리에 저장해뒀다가 나중에 타겟 아키텍처에 맞게 변환해야 하는 거죠.

문제는 VAX 포맷과 IEEE 754가 서로 표현할 수 있는 값의 범위가 다르다는 거예요. 예를 들어 IEEE 754의 단정밀도(float)는 약 10^-38부터 10^38까지의 값을 표현할 수 있는데, VAX의 F_floating은 약 0.29×10^-38부터 1.7×10^38까지로 살짝 달라요. 또 IEEE 754에는 NaN(숫자가 아님)이나 무한대(infinity) 같은 특수값이 있는데, VAX에는 이런 개념 자체가 없어요. VAX에서는 그런 비트 패턴이 "reserved operand"라는 트랩을 발생시키는 오류로 취급돼요.

그래서 컴파일러가 어떤 상수를 VAX용으로 변환하다가 "이 값은 VAX에서 표현 불가능"이라는 상황이 생겨요. 또 반올림 규칙도 달라서, 똑같은 0.1을 저장해도 IEEE에서는 a라는 비트 패턴이 되고 VAX에서는 b라는 패턴이 되는데, 이걸 왔다 갔다 변환하다 보면 미세한 오차가 누적되기도 하고요.

옛날 코드를 살리는 일의 가치

이 글이 보여주는 건, 단순히 "VAX 호환성을 맞췄다"는 무용담이 아니에요. 운영체제와 컴파일러처럼 수많은 아키텍처를 지원해야 하는 소프트웨어를 만들 때, 우리가 "당연하다"고 생각하는 것들(IEEE 754 같은 표준)이 실은 역사적인 합의의 산물이라는 걸 일깨워주는 거죠. 그리고 그 합의 이전 시대의 기계들은 지금도 묵묵히 자기 방식대로 동작하고 있고요.

한국 개발자에게 주는 시사점

우리는 평소에 부동소수점을 쓰면서 "왜 0.1 + 0.2 가 0.3이 안 나오지?" 같은 의문 정도만 가지지, 그 뒤에 어떤 표준과 역사가 있는지는 잘 모르고 지나가요. 그런데 임베디드 시스템이나 GPU 셰이더, 머신러닝 양자화 같은 영역에 가면 부동소수점의 세부 동작이 진짜 중요해져요. half precision, bfloat16 같은 새로운 포맷들도 결국은 IEEE 754의 변형이거든요.

또 하나 배울 점은, 오픈소스 프로젝트가 "옛날 하드웨어"를 어떻게 정성껏 다루는가예요. 단기적으로 보면 비효율 같지만, 그런 제약 속에서 짠 코드가 진짜 이식성 있고 단단한 코드가 돼요. 우리도 본인이 짜는 코드가 5년, 10년 뒤에도 살아남을 수 있게 만들고 싶다면, 이런 태도에서 배울 게 많을 거예요.

마무리

사라진 줄 알았던 옛 기계가 여전히 누군가의 손에 의해 살아 있다는 건, 소프트웨어 세계의 따뜻한 면이기도 해요. VAX의 부동소수점 이야기는 컴퓨터의 역사이자, 표준화 이전 시대의 다양성을 보여주는 살아있는 자료이기도 하고요.

여러분은 부동소수점 때문에 디버깅하다가 머리 아팠던 경험 있나요? 혹은 "이 코드는 어떤 아키텍처에서도 돌아야 한다"는 요구사항을 받아본 적 있나요? 댓글로 경험을 나눠주세요.


🔗 출처: Hacker News

이 뉴스가 유용했나요?

이 기술을 직접 배워보세요

파이썬으로 자동화를 시작해보세요

파이썬 기초부터 자동화까지 실전 강의.

파이썬 강의 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.