분리된 구간 집합 위에서 계산하는 계산기

4 hours ago 3

(victorpoughon.github.io)

  • 분리된 구간들의 합집합을 입력으로 받아 사칙연산, 함수 호출, 거듭제곱까지 수행하며, interval union arithmetic를 브라우저에서 직접 계산 가능
  • 결과 구간은 입력 합집합에서 고른 값들로 같은 식을 실수 위에서 계산했을 때의 값을 반드시 포함하며, 0을 포함하는 구간으로의 나눗셈도 분리된 합집합 형태로 처리 가능
  • 1 / [-2, 1]에서 [-∞, -0.5] U [1, +∞]가 나오고 tan([pi/3, 2*pi/3])에서 [-∞, -1.732] U [1.732, +∞]가 나오는 식으로, 불연속 구간 결과무한대 경계 표현 지원
  • [a, b], [a, b] U [c, d], 중첩 구간 문법, lo, hi, hull, log10, cos, min, max 같은 다양한 표기와 함수 지원
  • 전체 정밀도 모드에서는 IEEE 754 배정밀도 기반 바깥쪽 반올림으로 실제 값을 감싸는 구간을 반환하며, 0.1 + 0.2를 [0.29999999999999993, 0.3000000000000001]로 보여주는 점이 특징

개요

  • 분리된 구간들의 합집합을 대상으로 계산하는 계산기이며, 일반 실수뿐 아니라 interval union arithmetic 구현 지원
    • 구간 [a, b]는 a부터 b까지의 수 전체를 뜻하고, [a, b] U [c, d]는 서로 떨어진 구간들의 합집합 의미
    • 일반 구간 산술의 확장 형태이며, 0을 포함하는 구간으로의 나눗셈도 닫힘 성질을 유지한 채 계산 가능
  • 포함 성질 보장
    • 입력 합집합들에서 각각 임의의 실수를 하나씩 선택해 같은 식을 실수 위에서 계산하면, 그 결과가 출력 합집합 안에 반드시 포함되는 구조
  • 불확실성 표현 가능
    • 50 * (10 + [-1, 1]) 계산 결과 [450, 550] 예시 제공
  • 복잡한 구간 식 계산 지원
    • U 연산자를 사용해 ( [5, 10] U [15, 16] ) / [10, 100] 같은 식 입력 가능
    • 결과 [0.05, 1.6] 예시 제공
  • 연산 결과가 분리된 합집합이 될 수 있음
    • 1 / [-2, 1] 결과 [-∞, -0.5] U [1, +∞]
    • tan([pi/3, 2*pi/3]) 결과 [-∞, -1.732] U [1.732, +∞]
  • 전체 정밀도 모드에서는 일반 계산기처럼 사용할 수 있으면서도 부동소수점 정밀도 문제를 포함한 실제 값을 감싸는 구간 결과 제공
    • 0.1 + 0.2 결과 [0.29999999999999993, 0.3000000000000001] 예시 제시

문법

  • 기본 표기 지원
    • 구간 표기 [a, b] 지원
    • 예시 [0.5, 0.6]
  • 합집합 표기 지원
    • [a, b] U [c, d] 형태 지원
    • 예시 [0, 1] U [5, 6]
  • 사칙연산 및 거듭제곱 지원
    • 덧셈 A + B 예시 ➤ [90, 100] + [-2, 2] 결과 [88, 102]
    • 뺄셈 A - B 예시 ➤ [14, 16] - [8, 12] 결과 [2, 8]
    • 곱셈 A * B 예시 ➤ [-5, 10] * [2, 4] 결과 [-20, 40]
    • 나눗셈 A / B 예시 ➤ [2, 4] / [-1, 2] 결과 [-∞, -2] U [1, +∞]
    • 거듭제곱 A ^ B 예시 ➤ [2, 3] ^ [-2, 3] 결과 [0.1111, 27]
  • 함수와 상수 지원
    • 함수 호출 function(...) 형태 지원
    • log10([1, 10000]) 결과 [0, 4]
    • 상수 이름 입력 지원
    • pi 결과 [3.1415926535897927, 3.1415926535897936]
  • 숫자와 구간 혼합 입력 가능
    • [1, 2]처럼 대괄호 구문으로 구간 입력 가능
    • 3.14 같은 숫자는 폭이 0인 좁은 구간 [3.14, 3.14]로 해석됨
    • 전체 정밀도 모드에서는 이에 관련된 세부 차이 존재
    • 1.55 + [-0.002, 0.002] 결과 [1.548, 1.552]
  • 중첩 구간 문법 지원
    • [0, [0, 100]] 입력 가능하며 결과 [0, 100]
    • 구간 경계를 정의하는 내부 숫자들까지 모두 구간으로 해석되는 구조
    • 중첩된 구간에서 경계 자리에 들어간 구간은 그 구간의 상한을 취하는 방식
    • 이 설계로 경계 자체에 산술 적용 가능
    • [0, cos(2*pi)] 결과 [0, 1]

지원 함수

  • 상수 지원
    • inf, ∞, pi, e 지원
    • [-inf, 0] * [-inf, 0] 결과 [0, +∞]
  • 경계 추출 함수 지원
    • lo(A)는 하한 반환
      • lo([1, 2]) 결과 [1, 1]
    • hi(A)는 상한 반환
      • hi([1, 2]) 결과 [2, 2]
  • 구간 외피 계산 지원
    • hull(A)는 합집합을 하나의 구간으로 감싸는 형태
    • hull([1, 2] U [99, 100]) 결과 [1, 100]
  • 기본 수학 함수 지원
    • abs(A) 예시 abs([-10, 5]) 결과 [0, 10]
    • sqrt(A) 예시 sqrt([9, 49]) 결과 [3, 7]
    • sqinv(A) 예시 sqinv([4, 64]) 결과 [-8, -2] U [2, 8]
  • 로그 및 지수 함수 지원
    • log(A) 예시 log([0, 1]) 결과 [-∞, 0]
    • log2(A) 예시 log2([64, 1024]) 결과 [6, 10]
    • log10(A) 예시 log10([0.0001, 1]) 결과 [-4, 0]
    • exp(A) 예시 exp([-∞, 0] U [1, 2]) 결과 [0, 1] U [2.718, 7.389]
  • 삼각함수 및 역삼각함수 지원
    • cos(A) 예시 cos([pi/3, pi]) 결과 [-1, 0.5]
    • sin(A) 예시 sin([pi/6, 5*pi/6]) 결과 [0.5, 1]
    • tan(A) 예시 tan([pi/3, 2*pi/3]) 결과 [-∞, -1.732] U [1.732, +∞]
    • acos(A) 예시 acos([-1/2, 1/2]) 결과 [1.047, 2.094]
    • asin(A) 예시 asin([0, 1]) 결과 [0, 1.571]
    • atan(A) 예시 atan([-10, 2]) 결과 [-1.471, 1.107]
  • 최소값·최대값 함수 지원
    • min(A, B) 예시 min([1, 2], [0, 6]) 결과 [0, 2]
    • max(A, B) 예시 max([0, 10], [5, 6]) 결과 [5, 10]

전체 정밀도 모드

  • IEEE 754 배정밀도 부동소수점 위에서 바깥쪽 반올림 구현
    • JavaScript의 number 타입 사용
    • 같은 식을 실수와 무한 정밀도로 계산했을 때의 실제 값을 결과 구간이 반드시 포함하는 보장
  • 0.1 + 0.2 사례 포함
    • 0.3은 배정밀도 부동소수점으로 정확히 표현되지 않음
    • interval arithmetic는 0.3을 포함하는 구간 계산 수행
  • 전체 정밀도 모드 활성화 시 동작
    • 사용자가 입력한 숫자는 입력한 10진 표현에 가장 가까운 IEEE 754 값을 포함하되, 양쪽 경계가 그 값과 같지 않은 가장 작은 구간으로 해석
    • 출력 숫자는 사용 가능한 모든 10진 자릿수로 표시
    • Number.toString() 사용
  • 전체 정밀도 모드 비활성화 시 동작
    • 사용자가 입력한 숫자는 입력한 10진 표현에 가장 가까운 IEEE 754 값과 양 경계가 같은 퇴화 구간으로 해석
    • 출력 숫자는 최대 소수점 4자리로 표시
    • Number.toPrecision() 사용

버그

  • 계산기에 아직 버그가 남아 있을 가능성 언급
  • 문제 보고 경로로 GitHub 이슈 링크 제공

오픈소스

  • Interval Calculator와 계산기 엔진 not-so-float 모두 오픈소스로 공개
  • GitHub Sponsors 후원 링크 포함

향후 작업

  • 전체 정밀도 모드를 두 개의 제어 항목으로 분리 예정
    • 입력 해석
    • 표시 정밀도
  • ans 변수 추가 예정
    • 이전 입력 결과 저장 변수
  • 교집합 연산자 또는 함수 추가 예정
  • U 연산자 우선순위의 직관성 개선 예정
  • 빈 합집합 입력 지원 예정
Read Entire Article