정확수와 부정확수

리스펙스에는 임의 정밀도 정확 정수와 기약 정확 유리수, 그리고 정규 위치 표기로 출력하는 유한 IEEE-754 실수가 있습니다.

언제 필요한가요?

수학적 결과를 정확하게 유지해야 한다면 정확 정수와 유리수를 쓰세요. 실수는 부정확한 측정값이나 명시적으로 부정확한 연산이 문제에 들어올 때만 꺼내세요.

실행으로 확인하기

LISPEX
(list (/ 1 3) (+ 1 2.0) (number->string -0.0))

관측 결과

OUTPUT
(1/3 3.0 "-0.0")

예제 읽기

1/3은 기약 정확 유리수 그대로 남습니다. 정확수 1에 부정확수 2.0을 더하면 부정확수 3.0이 나옵니다. 출력은 음의 0이 가진 부호를 그대로 살리므로 number->string"-0.0"을 돌려줍니다.

이 순서로 생각하세요

  • 정확 산술의 결과는 정확하게 남습니다. + - * /는 피연산자 가운데 하나라도 부정확하면 부정확해집니다. 비교는 정확수와 부정확수를 섞어도 정확하게 비교합니다.
  • 무한대와 NaN은 런타임에 들어올 수 없습니다. 0으로 나누면 E313이고, 비유한 값이 만들어지면 E314입니다.
  • 유한 실수 출력은 왕복 가능한 최단 위치 표기만 씁니다. .0은 항상 붙이고 -0.0은 그대로 보존합니다.

빠르게 고르기

종류핵심 규칙
정확 정수0, -12, 999999999999임의 정밀도
정확 유리수1/3, -5/2양수 분모의 기약형으로 저장
유한 실수2.0, -0.0, 0.125유한 IEEE-754와 정규 위치 출력
혼합 산술(+ 1 2.0)부정확 피연산자 하나가 산술 결과를 부정확하게 함
혼합 비교(= 2 2.0)손실 있는 변환 없이 수학적으로 비교

흔한 오해

복소수와 플랫폼 libm 초월함수는 제외됩니다.

현재 경계

  • 산술의 정확·부정확 전염 규칙을 선택이나 비교의 의미론으로 넓혀 적용하면 안 됩니다.

다음으로

도메인과 시그니처는 수치 프로시저에 정리되어 있습니다. 수치 동등성과 정확성에 민감한 비교가 왜 다른지는 동등성에서 확인하세요.

수치 프로시저 · 동등성과 동일성