본문으로 건너뛰기
피드

0으로 나눠도 안 터지는 계산기 — 구간 합집합 산술 웹 계산기

open-source 약 7분
vote
0
댓글
북마크

Victor Poughon이 만든 interval union arithmetic 웹 계산기가 Show HN에 올라왔다. 실수 대신 '구간의 합집합'을 기본 단위로 삼아 0을 포함한 구간으로도 나누기가 가능하다. IEEE 754 double에 outward rounding을 적용해 0.1+0.2 같은 부동소수점 오차까지 구간으로 보장한다.

  • 1

    일반 interval arithmetic의 한계(0 나누기 폭발)를 합집합 기반으로 해결. `2 / [-2, 1]`이 `[-∞, -1] U [2, +∞]`로 나옴

  • 2

    Inclusion property: 입력 구간에서 아무 실수나 뽑아 실수 연산을 해도 결과는 출력 구간 안에 반드시 포함된다

  • 3

    0.1 + 0.2가 [0.29999999999999993, 0.3000000000000001]로 나와 부동소수점 오차를 정직하게 드러낸다

  • 4

    30개 넘는 수학 함수 지원 + 구간 중첩 문법 (`[0, cos(2*pi)]` 같은 표현 가능)

  • 5

    엔진 not-so-float도 오픈소스. IEEE 754 double에 직접 outward rounding 구현

  • Show HN에 올라온 "구간 합집합 산술(Interval Union Arithmetic) 계산기"
    • 실수가 아니라 구간(interval)의 합집합 단위로 계산함. 예를 들어 [a,b] ∪ [c,d] 같은 disjoint 구간들
    • 만든 사람은 Victor Poughon. 엔진은 not-so-float라는 별도 오픈소스 라이브러리
  • 일반 구간 산술(interval arithmetic) 대비 왜 "vastly superior"냐면
    • 0을 포함한 구간으로 나누기가 가능하고 그래도 결과가 닫혀있음(closed)
    • 예: 2 / [-2, 1][-∞, -1] ∪ [2, +∞]. 0을 건너뛰는 게 자연스럽게 표현됨
    • 일반 interval arithmetic에서는 이 연산이 정의 불능이거나 무한대로 폭발함

핵심 속성 — Inclusion Property

  • 각 입력 구간에서 아무 실수나 뽑아 같은 식을 실수 연산으로 돌리면, 그 결과는 반드시 출력 구간 안에 들어온다
    • 불확실성 표현에 쓸 수 있다는 뜻. 50 * (10 + [-1, 1])[450, 550]
    • 측정 오차나 파라미터 범위를 그대로 식에 녹여서 결과 범위를 얻을 수 있음
  • 복잡한 식도 구간 합집합 연산자 U로 조합 가능
    • ([5, 10] U [15, 16]) / [10, 100][0.05, 1.6]
    • tan([pi/3, 2*pi/3])[-∞, -1.732] U [1.732, +∞] (탄젠트 발산 구간을 두 조각으로 깔끔하게)

부동소수점 오차까지 보장해준다

  • Full precision 모드에서 0.1 + 0.2 돌려보면
    • 결과가 [0.29999999999999993, 0.3000000000000001]
    • 0.3이 double로 정확히 표현되지 않는다는 사실이 그대로 드러남. 그런데도 참값 0.3이 반드시 이 구간 안에 있음이 수학적으로 보장됨
  • IEEE 754 double에 대해 outward rounding을 구현해서 이걸 달성
    • 입력 숫자는 "IEEE 754 가장 가까운 값"을 포함하는 최소 구간으로 해석됨
    • 바깥쪽으로 둥글리기(outward rounding)라 실제 값이 구간 밖으로 나갈 일이 없음

문법과 기능

  • 지원 연산: + - * / ^, 비교, 그리고 30개 넘는 수학 함수
    • sqrt, log, log2, log10, exp, cos/sin/tan, acos/asin/atan, abs
    • hull([1,2] U [99,100])[1, 100] (합집합의 convex hull)
    • sqinv([4, 64])[-8, -2] U [2, 8] (제곱의 역 — 두 개의 disjoint 구간)
  • 재밌는 문법 특성으로 구간 중첩이 가능
    • [0, [0, 100]][0, 100]
    • 내부 구간은 상한값으로 해석됨. [0, cos(2*pi)]처럼 bound 자체에 계산식 가능

💡

> 실무에서 측정 오차나 센서 허용 범위를 계산식에 녹일 때 유용. "14±2를 8±2로 나누면?" 같은 문제를 한 줄로 풀 수 있다.


기술 맥락

일반 interval arithmetic(IA)는 1960년대 Ramon Moore가 정리한 분야인데, 오래 전부터 한계가 하나 있었어요. 0을 포함한 구간으로 나누면 결과가 "모든 실수"가 돼버려서 정보량이 0이 되거든요. 1 / [-1, 1](-∞, +∞)가 되면 이걸로 뭘 할 수가 없잖아요.

Interval Union Arithmetic은 이 문제를 "여러 구간의 합집합"을 기본 단위로 삼아서 해결해요. 1 / [-1, 1](-∞, -1] U [1, +∞)로 깔끔하게 나와서 정보가 보존돼요. 0 주변의 불가능 영역을 그대로 표현할 수 있는 거죠.

왜 이게 실용적이냐면, 부동소수점 연산의 오차를 "나도 모르게" 누적시키지 않고 명시적으로 추적할 수 있기 때문이에요. 예를 들어 과학 계산, 로봇 경로 계획, 최적화 알고리즘에서 "이 값이 어느 범위에 있는지 확실히 알아야" 하는 상황에서 쓰여요. MATLAB의 INTLAB, Python의 mpmath 같은 기존 라이브러리도 비슷한 목적이지만, 브라우저에서 즉시 쓸 수 있는 계산기 UI로 만든 건 교육적으로 꽤 가치가 있어요.

구현 관점에서 흥미로운 대목은 JavaScript의 number 타입(IEEE 754 double) 하나로 outward rounding을 직접 처리한다는 점이에요. 보통은 MPFR 같은 임의 정밀도 라이브러리를 붙이는데, 이 프로젝트는 not-so-float라는 경량 엔진을 따로 만들어서 네이티브 double 위에서 돌려요. 그래서 브라우저에서도 성능이 잘 나오는 거죠.

수치 불확실성을 식 수준에서 다루는 도구가 브라우저에서 즉시 쓰일 수 있게 된 사례. 교육과 프로토타이핑 양쪽에서 쓸모 있다.

댓글

댓글

댓글을 불러오는 중...

open-source

MySQL부터 MongoDB까지, 오픈소스가 데이터베이스 판을 바꾼 30년

이 글은 MySQL, MariaDB, PostgreSQL, SQLite, MongoDB, Hadoop을 따라가며 데이터베이스 세계에서 오픈소스가 어떻게 표준이 되고 상업화의 대상이 됐는지 풀어낸다. 무료 코드가 스타트업과 빅데이터 생태계를 키웠지만, 동시에 인수, 라이선스, 클라우드 흡수 같은 현실적인 긴장도 만들었다는 얘기야.

open-source

UCLA가 3천 달러짜리 오픈소스 로봇 손 ‘마이다스 핸드’를 공개

UCLA 로봇연구소 RoMeLa가 로봇 조작과 AI 학습 연구용 오픈소스 로봇 손 MIDAS Hand를 공개했어. 13개 능동 자유도, 3개 수동 자유도, 283개 3축 촉각센서, 약 3,000달러 부품 원가를 내세워 고성능 로봇 손 연구의 접근성을 낮추려는 프로젝트야.

open-source

러스트로 다시 만든 로컬 코딩 에이전트 ‘파이’, 자동화까지 노린다

파이는 기존 pi 코딩 에이전트를 러스트로 다시 만든 터미널 기반 AI 코딩 에이전트다. 프로젝트 안에서 파일을 읽고 수정하고, 셸 명령을 실행하고, 세션을 이어가며, 로컬 모델과 여러 모델 제공자를 쓸 수 있다. 단순 채팅 UI가 아니라 트리거, 크론, MCP 알림, 에이전트 간 허브 메시징까지 넣은 로컬 에이전트 런타임을 지향한다.

open-source

윈도우 95 시절 쉘 API로 만든 명령줄 도구, WinUtils 회고

글쓴이가 1996~1997년에 만든 WinUtils는 윈도우 95의 쉘 API를 감싼 얇은 명령줄 도구 모음이었다. 직접 파일 입출력을 구현하는 대신 탐색기와 같은 복사, 이동, 삭제, 휴지통, 확인창 동작을 그대로 활용한 점이 핵심이다.

open-source

Paseo, 여러 코딩 에이전트를 한 화면에서 돌리는 오픈소스 인터페이스 공개

Paseo는 Claude Code, Codex, Copilot, OpenCode, Pi 같은 코딩 에이전트를 한 인터페이스에서 실행하고 관리하는 오픈소스 도구다. 로컬 daemon이 에이전트 프로세스를 관리하고, 데스크톱·모바일·웹·CLI 클라이언트가 여기에 연결되는 구조라 자기 개발 환경 위에서 병렬 작업을 돌릴 수 있다.