---
title: "0으로 나눠도 안 터지는 계산기 — 구간 합집합 산술 웹 계산기"
published: 2026-04-18T01:15:43.000Z
canonical: https://jeff.news/article/1823
---
# 0으로 나눠도 안 터지는 계산기 — 구간 합집합 산술 웹 계산기

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

- 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 자체에 계산식 가능

> [!TIP]
> 실무에서 측정 오차나 센서 허용 범위를 계산식에 녹일 때 유용. "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 위에서 돌려요. 그래서 브라우저에서도 성능이 잘 나오는 거죠.

## 핵심 포인트

- 일반 interval arithmetic의 한계(0 나누기 폭발)를 합집합 기반으로 해결. `2 / [-2, 1]`이 `[-∞, -1] U [2, +∞]`로 나옴
- Inclusion property: 입력 구간에서 아무 실수나 뽑아 실수 연산을 해도 결과는 출력 구간 안에 반드시 포함된다
- 0.1 + 0.2가 [0.29999999999999993, 0.3000000000000001]로 나와 부동소수점 오차를 정직하게 드러낸다
- 30개 넘는 수학 함수 지원 + 구간 중첩 문법 (`[0, cos(2*pi)]` 같은 표현 가능)
- 엔진 not-so-float도 오픈소스. IEEE 754 double에 직접 outward rounding 구현

## 인사이트

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