정확한 수와 근삿값

분수를 정확하게 유지하고, 부정확수로 계산하고, 두 수의 결과와 출력 표기를 비교합니다.

삼분의 일 같은 결과를 분수로 유지하려면 정확수를 쓰세요. 측정값을 다루거나 반올림을 허용하는 계산에는 부정확수를 쓸 수 있습니다.

결과 비교하기

아래 예제 전체를 플레이그라운드에서 실행하세요.

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

결과

출력
(1/3 3.0 "-0.0")

(/ 1 3)은 정확한 분수 1/3을 돌려줍니다. 정확수 1에 부정확수 2.0을 더하면 부정확수 3.0이 나옵니다. 수를 문자열로 바꾸는 number->string은 -0.0의 음수 부호도 유지합니다.

수의 종류 고르기

종류예저장 방식
정확 정수0, -12, 999999999999임의 정밀도를 사용하므로 고정된 기계 정수 크기를 넘어설 수 있음
정확 유리수1/3, -5/2더 약분할 수 없는 분수로 저장하며 분모는 양수
부정확 실수2.0, -0.0, 0.125유한한 64비트 IEEE-754 부동소수점 수

약분한 분모가 1이면 정확 정수가 됩니다. 예를 들어 (/ 10 5)는 2를 돌려줍니다.

+, -, *, /는 입력이 모두 정확수이면 정확수를 돌려줍니다. 입력 중 하나라도 부정확수이면 모든 입력을 부동소수점 수로 바꿔 계산합니다.

정확수를 반올림하지 않고 비교하기

LISPEX
(list (= 2 2.0) (= 1/10 0.1) (min 1 2.0))

결과

출력
(#t #f 1.0)

2와 2.0의 수학적 값은 같습니다. 부정확수 0.1은 십분의 일을 이진수로 근사해 저장하므로 정확수 1/10과 다릅니다.

수 비교 프로시저 =, <, >, <=, >=는 저장된 값을 정확하게 비교합니다. 비교 전에 정확수를 부동소수점 수로 반올림하지 않습니다.

min과 max도 정확하게 비교한 뒤 값을 고릅니다. 입력 중 하나라도 부정확수이면 고른 값을 부정확수로 돌려줍니다. 따라서 (min 1 2.0)의 결과는 1.0입니다.

실수 출력 읽기

실수는 지수 표기 없이 소수로 출력됩니다. 같은 부동소수점 값으로 다시 읽을 수 있는 가장 적은 자릿수를 씁니다.

입력결과
(number->string 0.125)"0.125"
(number->string 1e3)"1000.0"
(number->string -0.0)"-0.0"

소수 부분이 없는 실수에는 .0이 붙습니다. 음의 0은 부호를 유지합니다.

수 오류 확인하기

0으로 나누면 E313 오류가 납니다. 계산이나 변환 결과가 무한대 또는 NaN이 되면 E314 오류가 납니다.

위 수 타입으로 정수와 분수와 유한 실수를 다룰 수 있습니다. 복소수와 sin, log 같은 함수는 지원하지 않습니다. 정수 거듭제곱과 정수 제곱근에는 expt와 exact-integer-sqrt를 쓰세요.

관련 문서

수치 프로시저에서 인자와 오류를 확인하세요. 동등성과 동일성은 비교할 때 정확수와 부정확수를 구별하는 경우를 설명합니다.