소수를 저장하는 방법은 여러 가지가 있으며 각 방법에는 장단점이 있습니다.
부동 소수점 은 가장 널리 사용되는 형식입니다. 부호, 가수 및 부호있는 기수 2 지수를 정수로 인코딩하고 비트로 묶음으로써 작동합니다. 예를 들어 32 비트 가수 0.5
(로 인코딩 됨 0x88888888
)와 32 비트 부호있는 지수 +3
( 0x00000003
)를 4.0
(0.5 * 2 ^ 3
). 부동 소수점 숫자는 하드웨어에서 구현되기 때문에 빠르며, 절대 크기의 정밀도 스케일, 즉 숫자가 작을수록 절대 정밀도가 좋아 지므로 상대 반올림 오류는 절대 크기로 일정하게 유지됩니다. 플로트는 길이, 음압 레벨, 광 레벨 등과 같은 연속 영역에서 샘플링 된 값에 탁월하며, 이로 인해 통계 분석 및 물리 시뮬레이션뿐만 아니라 오디오 및 이미지 처리에 일반적으로 사용됩니다. 가장 큰 단점은 정확하지 않다는 것, 즉 반올림 오류가 발생하기 쉽고 모든 소수를 정확하게 표현할 수 없다는 것입니다. 모든 주류 프로그래밍 언어에는 일종의 부동 소수점이 있습니다.
고정 소수점충분히 큰 정수를 사용하고 소수 부분에 대해 비트의 일부를 암시 적으로 예약하여 작동합니다. 예를 들어, 24.8 비트 고정 소수점 수는 정수 부분 (부호 포함)에 24 비트, 소수 부분에 8 비트를 예약합니다. 이 숫자를 8 비트로 오른쪽 이동하면 정수 부분이됩니다. 고정 소수점 숫자는 하드웨어 부동 소수점 단위가 일반적이지 않거나 정수의 정수보다 훨씬 느릴 때 널리 사용되었습니다. 고정 소수점 숫자는 정확성 측면에서 처리하기가 다소 쉽지만 (추론하기가 더 쉬운 경우에만) 다른 모든 측면에서 부동 소수점보다 열등합니다. 정밀도가 낮고 범위가 작으며 추가로 인해 암시 적 시프트에 대한 계산을 수정하려면 연산이 필요합니다. 오늘날 고정 소수점 수학은 종종 부동 소수점 수학보다 느립니다.
10 진수 유형은 부동 소수점 또는 고정 소수점 숫자와 매우 유사하지만 10 진수 시스템, 즉 지수 (암시 적 또는 명시 적)는 2의 거듭 제곱이 아니라 10의 거듭 제곱을 인코딩한다고 가정합니다. 예를 들어 10 진수는 가수 23456
와 지수를 인코딩 -2
할 수 있습니다.234.56
. 십진수는 산술이 CPU에 하드 와이어로 연결되어 있지 않기 때문에 부동 소수점보다 느리지 만 소수를 포함하고 정확한 숫자가 필요한 모든 것에 이상적입니다. 반올림은 재정의 계산, 스코어 보드 등. 일부 프로그래밍 언어에는 10 진수 유형 (예 : C #)이 내장되어 있고 다른 언어에는이를 구현하기위한 라이브러리가 필요합니다. 소수는 반복되지 않는 소수를 정확하게 나타낼 수 있지만 정밀도는 부동 소수점 숫자보다 정확하지 않습니다. 소수를 선택한다는 것은 소수 시스템에서 정확하게 표현할 수있는 숫자를 정확하게 표현한다는 것을 의미합니다 (float가 이진 소수를 정확하게 나타낼 수있는 것처럼).
유리수 는 일반적으로 일종의 bignum 정수 유형 (컴퓨터의 메모리 제한 조건이 허용하는 한도에서 커질 수있는 숫자 유형)을 사용하여 분자와 분자를 저장합니다. 이것은 1/3
또는 같은 숫자를 정확하게 모델링 할 수있는 유일한 데이터 유형이며 3/17
다른 데이터 유형과 달리 합리적은 다음과 같은 것에 대한 올바른 결과를 생성합니다3 * 1/3
. 효율적인 인수 분해 알고리즘을 생각해내는 것은 다소 어려운 일이지만 수학은 매우 간단합니다. 일부 프로그래밍 언어에는 합리적인 유형이 내장되어 있습니다 (예 : Common Lisp). 합리성의 단점은 느리거나 (많은 연산은 분수를 줄이고 구성 요소를 분해해야 함) 많은 일반적인 연산은 구현하기 어렵거나 불가능하며, 대부분의 구현은 이러한 상황이 발생할 때 플로트에 대한 합리성을 저하시킵니다 (예 : 호출 할 때) sin()
합리적인).
BCD (Binary Coded Decimal)는 "니블"(4 비트 그룹)을 사용하여 개별 숫자를 인코딩합니다. 니블은 16 개의 서로 다른 값을 보유 할 수 있지만 10 진수는 10 개만 필요하므로 니블 당 6 개의 "잘못된"값이 있습니다. 소수점과 마찬가지로 BCD 숫자는 십진수로 정확합니다. 즉, 십진수에서 수행 된 계산은 펜과 종이를 사용했을 때와 같은 방식으로 작동합니다. BCD의 산술 규칙은 다소 어색하지만, 다른 형식보다 문자열로 변환하는 것이 더 쉽다는 장점이 있습니다. 이는 임베디드 시스템과 같은 저자 원 환경에 특히 흥미 롭습니다.
문자열 , 예, 평범한 오래된 문자열도 분수를 나타내는 데 사용할 수 있습니다. 기술적으로 이것은 BCD와 매우 유사하며 명시 적 소수점이 있고 소수점 이하 자릿수 하나만 사용한다는 점만 다릅니다. 따라서 형식은 낭비 적이지만 (256 개의 가능한 값 중 11 개만 사용됨) BCD보다 구문 분석 및 생성이 더 쉽습니다. 또한 사용 된 모든 값이 "의심스럽지 않고"무해하며 플랫폼 중립적이므로 문자열 인코딩 된 숫자는 문제없이 네트워크를 통해 이동할 수 있습니다. 산술이 문자열에서 직접 수행되는 것은 드문 일이지만 가능할 수 있으며 그렇게 할 때 다른 10 진수 형식 (10 진수 및 BCD)과 마찬가지로 정확히 10 진수입니다.