고정 소수점 산술
Fixed-point arithmetic![]() |
계산에서 고정점은 소수(비정수)의 부분 자리수를 고정적으로 기억함으로써 소수(비정수)를 표현하는 방법을 말한다.예를 들어, 달러 금액은 종종 정확히 두 개의 소수 자릿수로 저장됩니다. 이 숫자는 센트를 나타냅니다(달러 100분의 1).보다 일반적으로, 이 용어는 분수 값을 일부 고정된 작은 단위의 정수 배수(예: 10분 간격의 정수 배수)로 나타낼 수 있다.고정 소수점 수 표현은 종종 보다 복잡하고 계산상 요구가 까다로운 부동 소수점 표현과 대조됩니다.
고정점 표현에서 분수는 정수 부분과 같은 수 기저로 표현되는 경우가 많지만 기저 b의 음의 거듭제곱을 사용한다.가장 일반적인 변형은 10진수(기본값 10)와 2진수(기본값 2)입니다.후자는 일반적으로 이진 스케일링이라고도 합니다.따라서 n일부 숫자가 보관되어 있는지 값은 정수 b−n의 배수이다.때 1000달러의 배수로 큰 달러 가치를 나타내는Fixed-point 표현 또한 정수 값의low-order 숫자는 예를 들어 생략하는데 사용될 수 있다.
언제 소수 fixed-point 숫자 인간의 독서에 대해 표시되면 소수 부분 자릿수 주로는 정수 부분의 기수 캐릭터(보통. 영어로 진행되었지만, ','또는 많은 다른 언어에서 다른 상징)로 분리되어 있다.내부적으로, 하지만 구분이 없고, 숫자의 두 집단 사이의 차별 그것을 다루는 프로그램에 의해서만 정의되었습니다.
고정점 표현은 기계식 계산기에서 표준이었다.대부분의 최신 프로세서는 고속 부동소수점 유닛(FPU)을 갖추고 있기 때문에 고정소수점 표현은 저비용 내장 마이크로프로세서나 마이크로컨트롤러 등 특수한 상황에서만 사용됩니다.또한 고속 및/또는 저소비전력, 이미지, 디지털 신호 처리 등 칩 영역이 작은 애플리케이션에서도 사용됩니다.그 문제에 대해서는, 그것들을 사용하는 것이 보다 자연스럽다.후자의 예로는 달러 금액의 회계처리, 센트의 일부를 엄격하게 규정된 방법으로 정수로 반올림해야 하는 경우, 표 검색에 의한 함수 평가 등이 있다.
표현
가치 표시되다 | 내부의 표현 |
---|---|
0.00 | 0 |
0.5 | 50 |
0.99 | 99 |
2 | 200 |
−14.1 | −1410 |
314.160 | 31416 |
소수점의 고정점 표현은 본질적으로 고정 스케일 계수를 암묵적으로 곱하는 정수이다.예를 들어 1.23 값은 1/1000의 암묵적 스케일링 계수를 갖는 정수 값 1230으로 변수에 저장될 수 있으며(마지막 3자리는 암묵적으로 소수 분수로 가정됨), 1 230 000 값은 암묵적 스케일링 계수를 1000으로 하는 1230으로 나타낼 수 있습니다('마이너스 3' 포함).(즉, 오른쪽에는 3개의 암묵적인 제로 디짓이 있습니다).이 표현을 통해 표준 정수 연산 장치가 합리적인 수 계산을 수행할 수 있습니다.
음의 값은 보통 위와 같은 암묵적 스케일링 계수를 사용하여 2의 보형 표현에서 부호 있는 정수로 이진 고정 소수점 형식으로 표시됩니다.값의 부호는 분수 비트 수가 총 비트 수보다 크거나 같더라도 항상 첫 번째 저장된 비트(1 = 음, 0 = 비음)로 표시됩니다.예를 들어 -3, +5 및 +12 암시 분수 비트와 함께 8비트 부호 이진수(θ10101)2 = -11은−3 각각 -11/2 = -88, -11/25 = -0.343 75 및 -11/212 = -0.002 685 546 875의 값을 나타냅니다.
혹은 부호크기 형식의 정수로 음의 값을 나타낼 수 있으며, 이 경우 부호는 암묵적인 분수 비트의 수에 포함되지 않는다.이 변형은 10진수 고정 소수점 산술에서 더 일반적으로 사용됩니다.따라서 부호 있는 5자리 소수 정수(-00025)10는 -3, +5, +12의 암묵적인 소수 자릿수로 지정되며, 각각 -25/10−3 = -25/10512 = -0.000 000 025 및 -25/10 = -0.000 000 000 025 값을 나타냅니다.
프로그램은 보통 주어진 변수에 저장되거나 주어진 명령에 의해 생성되는 모든 고정 소수점 값이 동일한 스케일링 계수를 갖는다고 가정합니다.이 파라미터는 일반적으로 프로그래머가 필요한 정밀도와 저장할 값의 범위에 따라 선택할 수 있습니다.
변수 또는 공식의 스케일 팩터가 프로그램에 명시적으로 나타나지 않을 수 있습니다.그 후, 양호한 프로그래밍 프랙티스를 사용하려면 적어도 소스 코드의 코멘트로서 매뉴얼에 기재되어 있어야 합니다.
스케일 팩터 선택
효율성을 높이기 위해 척도 인자는 종종 내부적으로 정수를 나타내는 데 사용되는 기저 b의 거듭제곱(양수 또는 음수)으로 선택됩니다.그러나 대부분의 경우 최상의 확장 요인은 애플리케이션에 의해 결정됩니다.따라서 정수가 내부적으로 2진수로 표시되는 경우에도 인간의 편의를 위해 10의 거듭제곱(예: 달러 값의 1/100)인 스케일 계수를 사용하는 경우가 많다.고정점 스케일링 팩터의 선택은 종종 측정 단위(미터 대신 센티미터 또는 마이크론)의 선택과 동일하기 때문에 십진수 스케일링 팩터는 미터법(SI) 시스템과 잘 일치한다.
그러나 다른 스케일 계수를 가끔 사용할 수 있다. 예를 들어, 소수 시간(시간)은 정수 초수, 즉 스케일 계수가 1/3600인 고정 소수점 수로 나타낼 수 있다.
가장 세심한 반올림에도 스케일링 계수 S로 표현되는 고정 소수점 값은 기억 정수에서 최대 ±0.5의 오차, 즉 값의 ±0.5S의 오차를 가질 수 있다.따라서 일반적으로 스케일링 요인이 작을수록 더 정확한 결과를 얻을 수 있습니다.
반면 스케일링 계수가 작을수록 주어진 프로그램 변수에 저장할 수 있는 값의 범위가 작다는 것을 의미합니다.변수에 저장할 수 있는 최대 고정 소수점 값은 변수에 저장할 수 있는 최대 정수 값에 스케일링 계수를 곱한 값이며, 최소 값도 이와 유사합니다.예를 들어, 아래 표에는 암시적 스케일링 계수 S, 최소 및 최대 표현 가능한min 값 V 및max V, 16비트 부호 이진 고정 소수점 형식으로 나타낼 수 있는 값의 정확도 θ = S/2가 나와 있으며, 이는 암시적 분수 비트 수 f에 따라 달라집니다.
f | S | δ | V분 | V맥스. |
---|---|---|---|---|
−3 | 1/2−3 = 8 | 4 | −262 144 | +262 143 |
0 | 1/20 = 1 | 0.5 | - 32 768 | +32 767 |
5 | 1/25 = 1/32 | 0.016 미만 | - 802.000 00 | +1023.968 75 |
14 | 1/214 = 1/16 384 | < 0.000 031 | - 2.000000000000000000 | +1.999 938 964 843 75 |
15 | 1/215 = 1/32 768 | 0.000 016 미만 | - 1.000000000000000000000 | +0.999 969 482 421 875 |
16 | 1/216 = 1/65 536 | 0.000 008 미만 | - 0 . 500 000 000 000 000 0 | +0.499 984 741 210 937 5 |
20 | 1/220 = 1/1 048 576 | < 0 . 000 000 5 | -0.031 250 000 000 000 00 | +0.031 249 046 325 683 593 75 |
2-1n 형식의 스케일링 팩터(즉, 1, 3, 7, 15, 31 등)를 가지는 고정 소수점 포맷은 이미지 처리 및 기타 디지털 신호 취득 태스크에 적합하다고 알려져 있습니다.이들은 보통n 2개의 스케일링보다 고정 소수점과 부동 소수점 값 간에 더 일관된 변환을 제공해야 합니다.줄리아 프로그래밍 언어는 두 [1]버전을 모두 구현합니다.
정확한 값
1/16 또는 17/32와 같은 모든 이진수 a/2는m nµm의 스케일링 계수 1/2의n 거듭제곱으로 고정점으로 정확하게 나타낼 수 있습니다.그러나 0.1 또는 0.123과 같은 대부분의 십진수는 기저 2의 무한 반복분수이므로 이 방법으로 나타낼 수 없습니다.
마찬가지로 1/100 또는 37/1000과 같은 소수점 a/10은m nµm의 10제곱 배율 1/10을n 사용하여 고정점에 정확하게 나타낼 수 있습니다.이 10진수 형식은 1/8(0.125) 또는 17/32(0.53125)와 같은 이진수 a/2를m 나타낼 수도 있습니다.
보다 일반적으로 a와 b가 비교적 소수이고 b가 양의 유리수 a/b는 b가 2의 거듭제곱일 경우에만 2진수 고정점으로 정확하게 나타낼 수 있으며, b가 2 및/또는 5 이외의 소수 인자를 가지지 않을 경우에만 10진수 고정점으로 나타낼 수 있다.
부동 소수점과의 비교
고정 소수점 계산은 부동 소수점 계산보다 더 빠르고/또는 더 적은 하드웨어를 사용할 수 있습니다.나타낼 값의 범위가 미리 알려져 있고 충분히 제한되면 고정점을 통해 사용 가능한 비트를 더 잘 사용할 수 있습니다.예를 들어 32비트가 0과 1 사이의 숫자를 나타내는 데 사용 가능한 경우 고정소수점 표현은 1.2 × 10 미만의 오차를 가질 수 있지만 표준 부동소수점 표현은 최대 596−10−10 × 10의 오차를 가질 수 있습니다.이는 9비트가 동적 스케일링 팩터의 부호와 지수로 낭비되기 때문입니다.구체적으로는 32비트 고정소수와 부동소수점 오디오를 비교하면 헤드룸이 40dB 미만인 녹음은 32비트 고정소자를 사용하여 신호 대 잡음비가 높아집니다.
고정 소수점 연산을 사용하는 프로그램은 FPU의 가용성에 의존하지 않기 때문에 부동 소수점 연산을 사용하는 프로그램보다 일반적으로 더 휴대성이 높습니다.이러한 이점은 IEEE 부동소수점 표준이 널리 채택되기 전에는 특히 강했습니다. 이때 동일한 데이터를 사용한 부동소수점 계산은 제조업체에 따라, 그리고 종종 컴퓨터 모델에 따라 다른 결과를 산출합니다.
대부분의 임베디드 프로세서에는 FPU가 없습니다.이는 정수 연산 유닛이 필요로 하는 논리 게이트의 수가 상당히 적고 칩 면적이 훨씬 작기 때문입니다.또, 저속 디바이스에서의 부동 소수점 소프트웨어의 에뮬레이션은, 대부분의 애플리케이션에 있어서 너무 느리기 때문입니다.인텔 386 및 486SX와 같은 이전의 개인용 컴퓨터와 게임 콘솔용 CPU 칩도 FPU가 없었습니다.
고정 소수점 형식의 절대 분해능(연속값 간의 차이)은 전체 범위, 즉 스케일링 계수 S에서 일정합니다.이와는 대조적으로 부동소수점 형식의 상대 분해능은 전체 범위에서 거의 일정하며, 기저 b의 계수 내에서 변화한다. 반면 절대 분해능은 값 자체와 같이 여러 가지 크기 순서로 변화한다.
대부분의 경우, 고정 소수점 계산의 반올림 및 잘라내기 오차는 동등한 부동 소수점 계산의 오차보다 분석하기가 더 쉽습니다.디더링 및/또는 노이즈 쉐이핑과 같은 절단에 선형화 기법을 적용하는 것은 고정점 산술 내에서 보다 간단합니다.한편, 고정점을 사용하는 경우에는 프로그래머의 주의가 필요합니다.오버플로를 방지하려면 변수의 범위와 계산의 모든 중간값에 대한 훨씬 더 엄격한 추정치가 필요하며 스케일링 계수를 조정하기 위한 추가 코드도 필요합니다.고정 소수점 프로그래밍에서는 일반적으로 폭이 다른 정수 유형을 사용해야 합니다.고정 소수점 애플리케이션은 블록 부동 소수점을 이용할 수 있습니다.이것은 고정 소수점 데이터의 각 배열(블록)을 하나의 단어에 공통 지수로 스케일링하는 고정 소수점 환경입니다.
적용들
일반적으로 10진수 고정점은 통화값을 저장하는 데 사용되며, 변동 소수점 숫자의 복잡한 반올림 규칙이 종종 골칫거리가 됩니다.예를 들어, C로 작성된 오픈 소스 머니 관리 애플리케이션 GnuCash는 이러한 이유로 버전 1.6에서 부동 소수점에서 고정점으로 전환되었습니다.
이진 고정 소수점(이진 스케일링)은 비행 시뮬레이션 및 원자력 발전소 제어 알고리즘과 같이 수학적으로 집약적인 실시간 컴퓨팅에 1960년대 후반부터 1980년대까지 널리 사용되었다.여전히 많은 DSP 애플리케이션 및 맞춤형 마이크로프로세서에 사용되고 있습니다.각도와 관련된 계산에는 이진 각도 측정(BAM)이 사용됩니다.
이진 고정점은 STM32G4 시리즈 CORDIC 공동 프로세서와 JPEG 영상을 압축하는 데 사용되는 이산 코사인 변환(DCT) 알고리즘에 사용됩니다.
전기 계량기 및 디지털 시계와 같은 전자 계측기는 온도 또는 전원 공급 전압과 같은 유입 오류를 보상하기 위해 다항식을 사용하는 경우가 많다.계수는 다항식 회귀 분석을 통해 생성됩니다.이진 고정 소수점 다항식은 부동 소수점보다 더 많은 정밀도를 사용할 수 있으며 저렴한 CPU를 사용하여 고속 코드로 사용할 수 있습니다.반올림이 발생하는 횟수를 줄이고 고정 소수점 승수는 반올림 덧셈을 활용하기 위해 고정 소수점 다항식을 인수(예: y = d + x(c + x(b + xa)))하면 계측기에 중요한 정확도는 등가 비트 부동 소수점 계산과 잘 비교된다.
운용
덧셈과 뺄셈
동일한 암묵적 스케일링 계수를 사용하여 두 값을 더하거나 빼려면 기본 정수를 더하거나 빼면 됩니다. 결과는 공통 암묵적 스케일링 계수를 가지므로 피연산자와 동일한 프로그램 변수에 저장할 수 있습니다.이러한 연산은 오버플로가 발생하지 않는 한, 즉 결과 정수를 수신 프로그램 변수에 저장할 수 있는 한 정확한 수학 결과를 산출합니다.값의 스케일링 계수가 다른 경우 작업 전에 공통 스케일링 계수로 변환해야 합니다.
곱셈
두 개의 고정 소수점 숫자를 곱하려면 두 개의 기본 정수를 곱하는 것으로 충분하며 결과의 스케일링 계수가 스케일링 계수의 곱이라고 가정합니다.결과는 수신 변수를 오버플로하지 않는 한 반올림 없이 정확하게 나타납니다.
예를 들어 123에 1/1000(0.123)을 곱하고 25에 1/10(2.5)을 곱하면 정수 123×25 = 3075에 (1/1000)×(1/10) = 1/10, 즉 3075/10 = 0.3075가 됩니다.또 다른 예로, 첫 번째 숫자에 1/32를 암묵적으로 배율한 155를 곱하면 (1/1000)×(1/32) = 1/32000인 정수 123×125 = 19065가 된다. 즉, 19065/32000 = 0.59578125이다.
이항에서는 일반적으로 2의 거듭제곱인 스케일 계수를 사용합니다.곱셈 후 스케일 계수는 오른쪽으로 이동함으로써 분할할 수 있다.기계적으로 이 과정은 대부분의 컴퓨터에서 간단하고 빠릅니다.반올림은 이동하기 전에 스케일 팩터의 절반에 대한 '둥근 추가'를 추가하여 가능합니다.증명: round(x/y) = floor(x/y + 0.5) = floor((x + y/2)/y) = shift-of-n(x + 2^(n-1))과 유사한 방법을 스케일링에서 사용할 수 있습니다.
나누기
두 고정 소수점 숫자를 나누기 위해 기본 정수의 정수 비율을 취하고 척도 계수가 척도 계수의 몫이라고 가정합니다.일반적으로 첫 번째 분할은 반올림이 필요하기 때문에 결과가 정확하지 않습니다.
예를 들어, 1/100(34.56)으로 스케일링한 3456과 1/1000(1.234)으로 스케일링한 1234를 나누면 스케일 팩터 (1/100)/(1/1000) = 10으로 스케일링한 정수 3456341234 = 3(표준)이 생성됩니다. 즉, 30입니다.또 다른 예로, 첫 번째 수를 암묵적으로 1/32로 스케일링한 155로 나누면(1000/32 = 4.84375) 암묵적 스케일링 계수(1/100)/(1/32)= 32/100 = 8/25인 정수 3456µ = 22(표준)가 산출된다. 즉, 22×32/100 = 7.04이다.
결과가 정확하지 않으면 반올림으로 인한 오차를 줄이거나 더 작은 배율로 변환함으로써 제거할 수 있다.예를 들어, r = 1.23이 스케일링 1/100에서 123으로 표시되고 s = 6.25가 스케일링 1/1000에서 6250으로 표시되는 경우, 정수의 단순 나눗셈은 스케일링 계수(1/100)/(1/1000) = 10으로 123µ6250 = 0(표준)이 됩니다.r을 스케일링 팩터 1/1,000에서 1,230,000으로 처음 변환하면 스케일 팩터 1/1000(0.120)에서 1,230,000µ6250 = 197(표준)이 됩니다.정확한 값은 1.23/6.25 입니다.
스케일 변환
고정점 컴퓨팅에서는 값을 다른 스케일링 팩터로 변환해야 하는 경우가 많습니다.이 작업은 다음과 같이 수행해야 합니다.
- 암묵적 스케일링 계수가 다른 프로그램 변수에 값을 저장하려면
- 두 값을 동일한 스케일링 계수로 변환하여 추가 또는 감산할 수 있도록 한다.
- 값을 곱하거나 다른 값으로 나눈 후 원래 스케일링 계수를 복원하려면
- 나눗셈 결과의 정확성 향상
- 제품 또는 지수의 스케일 계수가 10 또는n 2와 같은n 단순한 검정력이 되도록 한다.
- 작업 결과를 오버플로 없이 프로그램 변수에 저장할 수 있도록 합니다.
- 고정 소수점 데이터를 처리하는 하드웨어 비용을 절감합니다.
스케일링 팩터가 R인 고정점 유형에서 스케일링 팩터 S인 다른 유형으로 숫자를 변환하려면 기본 정수에 비율 R/S를 곱해야 합니다.따라서 예를 들어 1.23 = 123/100 값을 스케일링 계수 R=1/100에서 스케일링 계수 S=1/1000인 값으로 변환하려면 정수 123에 (1/100)/(1/1000) = 10을 곱하여 1230/1000을 나타내야 합니다.
스케일링 팩터가 정수를 나타내기 위해 내부적으로 사용되는 베이스의 거듭제곱인 경우 스케일링 팩터를 변경하려면 정수의 하위 자리만 삭제하거나 0 자리를 추가하면 됩니다.그러나 이 작업에서는 번호 기호가 유지되어야 합니다.2의 보형 표현에서는 산술 시프트 연산에서와 같이 부호 비트를 확장하는 것을 의미합니다.
S가 R을 나누지 않으면(특히 새로운 스케일 계수 S가 원래 R보다 클 경우), 새로운 정수를 반올림해야 할 수 있다.
특히, r과 s가 암묵적 스케일링 계수 R과 S를 갖는 고정점 변수인 경우, 연산 r ← r×s는 각각의 정수를 곱하고 결과를 S로 명시적으로 나누어야 한다.결과는 반올림해야 하며 오버플로가 발생할 수 있습니다.
예를 들어 공통 스케일링 계수가 1/100인 경우 1.23에 0.25를 곱하면 123에 25를 곱하여 중간 스케일링 계수가 1/10000인 3075를 산출해야 합니다.원래의 스케일링 계수 1/100으로 되돌리려면 사용하는 반올림 정책에 따라 정수 3075에 1/100을 곱해야 합니다.즉, 100으로 나누면 31(0.31) 또는 30(0.30)이 됩니다.
마찬가지로, 연산 r ← r/s에서는 정수를 나누고 명시적으로 S를 곱해야 합니다. 반올림 및/또는 오버플로가 여기서도 발생할 수 있습니다.
부동소수점 변환 및 부동소수점 변환
부동 소수점에서 고정점으로 변환하려면 이를 스케일링 계수 S로 나눈 다음 결과를 가장 가까운 정수로 반올림할 수 있습니다.결과가 대상 변수 또는 레지스터에 맞도록 주의해야 합니다.스케일링 팩터와 스토리지 크기 및 범위 입력 숫자에 따라 변환에 반올림이 필요하지 않을 수 있습니다.
고정 소수점 숫자를 부동 소수점으로 변환하려면 정수를 부동 소수점으로 변환한 다음 스케일링 계수 S를 곱하면 됩니다.정수의 절대값이 2보다24 크거나(이진수 단정도 IEEE 부동소수점일 경우) 2보다53 크거나(이진수 단정도일 경우) 반올림을 수반할 수 있습니다.S가 각각 매우 크거나 매우 작을 경우 오버플로 또는 언더플로가 발생할 수 있습니다.
하드웨어 지원
스케일링 및 재규격화
일반적인 프로세서는 고정 소수점 연산을 지원하지 않습니다.그러나 이진수 산술이 있는 대부분의 컴퓨터에는 정수를 2의 거듭제곱으로 곱하거나 나눌 수 있는 빠른 비트 시프트 명령이 있습니다. 특히 산술 시프트 명령이 있습니다.이러한 지침을 사용하여 숫자 기호를 유지하면서 2의 거듭제곱인 스케일 계수를 빠르게 변경할 수 있습니다.
IBM 1620 및 Burroughs B3500과 같은 초기 컴퓨터는 정수에 대해 이진 코드 십진수(BCD) 표현을 사용했습니다. 즉, 각 십진수가 4비트로 독립적으로 인코딩된 10진수입니다.마이크로컨트롤러등의 일부의 프로세서는, 아직 사용하고 있는 경우가 있습니다.이러한 기계에서 10진수 스케일링 팩터의 변환은 비트 시프트 및/또는 메모리 주소 조작에 의해 이루어질 수 있다.
일부 DSP 아키텍처에서는 특정 고정 포인트 포맷(예를 들어 n-1 fraction 비트로 서명된n 비트 번호)에 대한 네이티브지원을 제공합니다(값의 범위는 -1 ~ 거의 +1).지원에는 2n-2에서n-1 [citation needed]프랙션비트로의 제품 스케일링 변환인 재규격화를 포함한 곱셈 명령이 포함될 수 있습니다.CPU가 이 기능을 제공하지 않는 경우 프로그래머는 제품을 충분히 큰 레지스터 또는 임시 변수로 저장하고 재규격화를 명시적으로 코드화해야 합니다.
오버플로
산술 연산 결과가 너무 커서 지정된 대상 영역에 저장할 수 없을 때 오버플로가 발생합니다.더하기 및 빼기 결과는 피연산자보다 1비트가 더 필요할 수 있습니다.두 개의 부호 없는 정수에 m과 n비트를 곱하면 결과는 m+n비트를 가질 수 있습니다.
오버플로우 시에는 보통 상위 비트가 손실되며, n은 기억영역의 크기인 비스케일 정수가 축소 모듈로n 2가 된다.특히 부호 비트가 손실되어 부호 및 값의 크기가 급격하게 변경될 수 있습니다.
일부 프로세서는 하드웨어 오버플로 플래그를 설정하거나 오버플로 발생 시 예외를 생성할 수 있습니다.일부 프로세서는 대신 포화 산술을 제공할 수 있습니다. 덧셈 또는 뺄셈 결과가 오버플로우일 경우 대신 수신 영역에 맞는 가장 큰 크기의 값을 저장하고 올바른 [citation needed]기호를 가집니다.
그러나 이러한 기능은 실제로는 그다지 유용하지 않습니다.일반적으로 오버플로우 가능성을 배제하기 위해 스케일링 팩터와 워드 사이즈를 선택하거나 오퍼랜드에 과도한 값이 없는지 확인하는 것이 더 쉽고 안전합니다.
컴퓨터 언어 지원
고정 소수점 번호에 대한 명시적 지원은 PL/I, COBOL, Ada, JOVICAL 및 Coral 66 등 몇 가지 컴퓨터 언어에 의해 제공됩니다.2진수 또는 10진수 스케일링 팩터와 함께 고정 소수점 데이터 유형을 제공합니다.컴파일러는 이러한 데이터 유형에 대한 작업을 수행할 때, 변수를 읽거나 쓸 때, 또는 값을 부동 소수점 등의 다른 데이터 유형으로 변환할 때 적절한 스케일 변환을 수행하기 위한 코드를 자동으로 생성합니다.
그 언어들의 대부분은 1940년에서 1990년 사이에 고안되었다.최신 언어에서는 일반적으로 고정 소수점 데이터 유형이나 스케일링 팩터 변환을 지원하지 않습니다.이것은 FORTRAN, C, C++와 같이 여전히 매우 인기 있는 몇몇 오래된 언어들도 마찬가지입니다.동작이 엄격하게 표준화된 고속 부동 소수점 프로세서의 광범위한 가용성으로 인해 바이너리 고정 소수점 [citation needed]지원에 대한 수요가 크게 감소했습니다.마찬가지로 C# 및 Python과 같은 일부 프로그래밍 언어에서 10진 부동 소수점을 지원함으로써 10진 고정 소수점 지원의 필요성이 거의 없어졌습니다.고정 소수점 연산을 필요로 하는 몇 가지 상황에서는 프로그래머가 임의의 프로그래밍 언어로 명시적인 스케일링 변환을 통해 구현할 수 있습니다.
한편, 모든 관계형 데이터베이스와 SQL 표기법은 고정 소수점 10진수 산술 및 숫자 저장을 지원합니다.포스트그레SQL에는 최대 1000자리의 [2]숫자를 정확하게 저장하기 위한 특수 유형이 있습니다.
게다가 2008년에 국제표준기구(ISO)는 임베디드 [3]프로세서에서 실행되는 프로그램의 이익을 위해 고정점 데이터 타입으로 C 프로그래밍 언어를 확장하는 제안을 발표했습니다.또한 GNU 컴파일러 컬렉션(GCC)은 고정점을 [4][5]백엔드로 지원합니다.
상세한 예
소수점 고정 소수점 곱셈
두 개의 고정 소수점 3자리 숫자를 가진 다음과 같은 곱셈이 있다고 가정합니다.
소수점 이하가 3자리이므로 후행 제로가 표시됩니다.이를 정수 곱셈으로 다시 정의하려면 먼저 모든 소수 자릿수를 정수 자릿수로 이동하면서 1000)({display 을 곱해야 합니다 다음 1/ - 3)을 곱하여 방정식을 되돌립니다.
비트 시프트는 곱셈 또는 나눗셈과 같기 때문에 다른 베이스(특히 컴퓨팅용 베이스 2)를 선택하는 경우에도 동일하게 동작합니다.소수점 3자리는 약 10자리 숫자에 해당하므로 2진수점 이후 0.05~10비트를 반올림해야 합니다.가장 가까운 근사치는 0.0000110011입니다.
따라서 우리의 곱셈은
소수점 뒤에 3자리 숫자가 있는 11.023으로 반올림됩니다.
이진 고정 소수점 곱셈
16개의 분수 비트를 사용하여 이진 고정점을 사용하여 1.2와 5.6의 곱을 계산하는 작업을 고려합니다.2개의 숫자를 나타내려면 2를16 곱하면 78643.2와 367 001.6이 됩니다.이러한 값을 가장 가까운 정수로 반올림하면 78643과 367 002가 됩니다.이 숫자들은 두 개의 보완 부호 형식을 가진 32비트 단어에 적합합니다.
이들 정수를 곱하면 35비트 정수 28862 138 286에 반올림 없이 32개의 분수 비트가 할당됩니다.이 값을 32비트 정수 변수에 직접 저장하면 가장 중요한 비트가 오버플로우 및 손실됩니다.실제로는 부호 있는 64비트 정수 변수 또는 레지스터에 저장됩니다.
결과가 데이터와 동일한 형식으로 16개의 분수 비트로 저장되는 경우, 그 정수를 2로 나누어16 약 440 401.28을 얻은 다음 가장 가까운 정수로 반올림해야 합니다.이 효과는 2를 더한15 다음 결과를 16비트 이동하면 얻을 수 있습니다.결과는 440401로, 값 6.719 985 961 914 062 5를 나타냅니다.형식의 정밀도를 고려할 때, 이 값은 6.719 986 ± 0.000 008로 더 잘 표현된다(피연산자 근사치에서 발생하는 오차는 계산하지 않음).정확한 결과는 1.2 × 5.6 = 6.72가 될 것이다.
좀 더 복잡한 예에서는 1.2와 5.6의 2개의 숫자를 각각 30과 20의 fraction 비트로 32비트 고정 소수점 형식으로 표현한다고 가정합니다.2와20 2로30 스케일링하면 1 288 490 188.8과 572 025.6이 되며, 이는 각각 1 288 490 189와 572 026으로 반올림됩니다.두 숫자 모두 32비트 부호 정수 변수에 적합하며 분수를 나타냅니다.
- 1.200 000 186 264 514 923 095 703 125 및
- 5.600 000 381 469 726 562 50
곱은 53비트 정수 7 566 047 890 552 914로, 30+20 = 50개의 암시 분수 비트를 가지므로 분수를 나타냅니다.
- 6.120 000 458 806 753 229 623 609 513 510
이 값을 8분수 비트로 부호화된 16비트 고정 형식으로 나타내려면 정수 곱을 2 = 2로42 나눈50-8 후 반올림해야 합니다. 이 값은 2를41 더하고 42비트만큼 이동하면 얻을 수 있습니다.결과는 1720/28 = 6.718 75, 즉 약 6.719 ± 0.002의 값을 나타낸다.
표기법
고정 소수점 형식의 매개 변수를 간결하게 지정하기 위해 다양한 표기가 사용되었습니다.다음 목록에서 f는 분수 비트 수, m은 크기 또는 정수 비트 수, s는 부호 비트 수, b는 총 비트 수를 나타냅니다.
- COBOL 프로그래밍 언어는 원래 임의 크기와 십진 배율을 가진 십진수 고정 정밀도를 지원하며, 그 형식은 "그래픽"으로 지정되었습니다.PIC 지시.예를 들어 PIC S9999V99에서는 소수점 [6]2자리의 부호 크기 6자리 소수 정수를 지정했습니다.
- 구성 REAL FIXTED BINARY(p,f)는 PL/I 프로그래밍 언어에서 사용되었으며, f 비트로 f 비트를 포함하는 고정 소수점 부호 바이너리 데이터 유형(부호 제외), 즉 스케일링 계수가 1/2인f p+1 비트 부호 정수입니다.후자는 긍정적일 수도 있고 부정적일 수도 있습니다.기본 10에는 REAL 대신 COMPLEX를, 기본 10에는 BINARY 대신 DIMAL을 지정할 수 있습니다.
- Ada 프로그래밍 언어에서 숫자 데이터 유형은 예를 들어 다음과 같이 지정할 수 있습니다.
type F is delta 0.01 range -100.0 .. 100.0
는 7개의 암묵적인 분수 비트(스케일링 팩터 1/128)와 최소 합계 15비트(실제 범위는 -128.00 ~ 거의 +128.00)[7]로 이루어진 2개의 보완 형식의 부호 있는 이진수로 구성된 고정 소수점 표현을 의미합니다. - Q 표기법은 Texas [8]Instruments에 의해 정의되었습니다.Qf는 f fraction 비트로 부호화된 바이너리 고정 소수점 값을 지정하기 위해 씁니다.예를 들어 Q15는 스케일링 팩터 1/2로15 부호화된 정수를 2의 보완 표기로 지정합니다.코드 Qm.f는 부호 비트를 카운트하지 않고 값의 정수 부분에 m비트를 포함하도록 지정합니다.따라서 Q1.30은 1개의 정수 비트와 30개의 분수 비트를 가진 이진 고정 소수점 형식을 나타내며, 스케일링 팩터 1/2를30 [8][9]가진 32비트 2의 보완 정수로 저장할 수 있습니다.부호 비트를 m 값으로 카운트하는 것을 제외하고, ARM에서도 같은 표기가 사용되고 있습니다.따라서 위의 형식은 Q2.[10][11]30으로 지정됩니다.
- Bm 표기법은 정수 부분에 m비트가 있는 고정 이진 형식을 의미하며, 나머지 단어는 분수 비트를 의미합니다.예를 들어 부호 있는 B16 번호에 저장할 수 있는 최대값과 최소값은 각각 32767.9999847 및 -32768.0입니다.
- VisSim 회사는 fxm.b를 사용하여 정수 부분에 b의 총 비트와 m비트가 있는 이진 고정 소수점 값, 즉 스케일링 팩터가 1/2인b−m b비트 정수를 나타냅니다.따라서 fx1.16은 정수 부분에 1비트가 있고 [12]분수에 15비트가 있는 16비트 숫자를 의미합니다.
- PS2 GS ("그래픽 신시사이저") 사용자 가이드에서는 s:m:f 표기를 사용합니다.여기서 s는 부호 [13]비트의 존재(0 또는 1)를 지정합니다.예를 들어 0:5:3은 스케일링 팩터가 1/2인3 부호 없는 8비트 정수를 나타냅니다.
- LabVIEW 프로그래밍 언어에서는 <s,b,m> 표기를 사용하여 'FXP' 고정 포인트 번호의 파라미터를 지정합니다.s 컴포넌트는 '+' 또는 '±' 중 하나로, 각각 부호 없는 숫자 또는 2의 보완 부호 있는 숫자 중 하나를 나타냅니다.b 구성요소는 총 비트 수이고 m은 정수 부분의 비트 수입니다.
소프트웨어 응용 프로그램 예시
- 일반적인 TrueType 글꼴 형식에서는 명령의 [14]일부 숫자 값에 대해 소수점 왼쪽에 26비트가 있는 32비트 서명 바이너리 고정점을 사용합니다.이 형식은 힌트 및 성능상의 [15]이유로 필요한 최소한의 정밀도를 제공하기 위해 선택되었습니다.
- 소니의 오리지널 플레이스테이션, 세가의 새턴, 닌텐도의 게임보이 어드밴스(2D만), 닌텐도 DS(2D와 3D), 닌텐도[16] 게임큐브와 GP2X 위즈 비디오 게임 시스템의 모든 3D 그래픽 엔진은 고정 소수점 연산을 사용했다.PlayStation은 변환 코프로세서에 12개의 fraction 비트를 포함한 16비트 고정점에 대한 하드웨어 지원을 포함했습니다.
- 과학자와 수학자들이 널리 사용하는 TeX 조판 소프트웨어는 모든 위치 계산에 16분율 비트를 가진 32비트 부호 2진수 고정점을 사용합니다.이 값은 타이포그래퍼 포인트의 분수로 해석됩니다.TeX 글꼴메트릭 파일은 32비트의 부호 있는 고정 소수점 숫자와 12개의 분수 비트를 사용합니다.
- Tremor, Toast 및 MAD는 각각 Ogg Vorbis, GSM Full Rate 및 MP3 오디오 형식을 디코딩하는 소프트웨어 라이브러리입니다.많은 오디오 디코딩하드웨어 디바이스에는 FPU가 없기 때문에 이들 코덱은 고정 소수점 연산을 사용합니다.
- Wavpack 무손실 오디오 컴프레서는 고정점 연산을 사용합니다.특히 하드웨어마다 부동소수점 반올림 규칙이 다르면 [17]압축의 무손실 특성이 손상될 수 있다는 우려로 인해 이러한 선택이 정당화되었습니다.
- Nest Labs Utilities 라이브러리는 특히 센서 샘플링 및 센서 출력 컨텍스트에서 고정 포인트 번호에 대한 제한된 매크로 및 함수 집합을 제공합니다.
- OpenGL ES 1.x 사양에는 FPU가 항상 있는 것은 아닌 임베디드 시스템을 대상으로 하는 API이기 때문에 고정점 프로파일이 포함되어 있습니다.
- dc 및 bc 프로그램은 임의의 정밀도 계산기이지만 (사용자가 지정한) 고정 소수 자릿수만 추적합니다.
- FPU가 없는 386 또는 486SX 프로세서를 탑재한 구형 PC에서는 FPU를 신속하게 그릴 수 있도록 하기 위해 Fracint는 Q2.[18]29 고정 소수점 숫자로 숫자를 나타냅니다.
- Doom은 id Software가 지도 시스템, 지오메트리, 렌더링, 플레이어 이동 등을 포함한 모든 비정수 계산에서 16.16 고정점 표현을 사용한 마지막 1인칭 슈팅 타이틀이었다.호환성을 위해 이 표현은 최신 Doom 소스 포트에서 여전히 사용됩니다.
- 고정점 번호는 이미지 및 비디오 프레임을 저장 및 조작하는 데 사용될 수 있습니다.화상처리를 목적으로 하는 SIMD 유닛을 갖춘 프로세서는 패킹된 고정점 데이터 처리에 적합한 명령을 포함할 수 있다.
- 양자 논리 게이트를 구현하는 Azure 양자 컴퓨터용 Q# 프로그래밍 언어는 큐비트 [19]레지스터에서 고정 소수점 산술을 수행하기 위한 표준 숫자 라이브러리를 포함합니다.
「 」를 참조해 주세요.
- Q(숫자 형식)
- Libfixmath - 고정 소수점 산술용 C로 작성된 라이브러리
- 부동 소수점 산술
- 로그수 체계
- 미니 인초
- 부동소수점 배율 블록
- 모듈로 연산
- μ-법칙 알고리즘
- A-법칙 알고리즘
레퍼런스
- ^ Julia 프로그래밍 언어 문서 FixedPointNumbers 패키지.
- ^ PostgreSQL 매뉴얼, 섹션 8.1.2. 임의 정밀도 번호
- ^ JTC1/SC22/WG14(2008), TR 18037 상태: 임베디드 C
- ^ GCC Wiki, 고정 소수점 산술 지원
- ^ GCC 사용, 섹션 5.13 고정 포인트유형
- ^ IBM Corporation, "숫자 항목"온라인 문서 사이트, 2021-07-05에 접속합니다.
- ^ Ada 83 문서: "Rationale, 5.3.2: 고정점 유형"2021-07-05에 액세스.
- ^ a b Texas Instruments, TMS320C64x DSP 라이브러리 프로그래머 레퍼런스, 부록 A.2
- ^ "MathWorks Fixed-Point Toolbox Documentation Glossary". mathworks.com.
- ^ "ARM Developer Suite AXD and armsd Debuggers Guide". 1.2. ARM Limited. 2001 [1999]. Chapter 4.7.9. AXD > AXD Facilities > Data formatting > Q-format. ARM DUI 0066D. Archived from the original on 2017-11-04.
- ^ "Chapter 4.7.9. AXD > AXD Facilities > Data formatting > Q-format". RealView Development Suite AXD and armsd Debuggers Guide (PDF). 3.0. ARM Limited. 2006 [1999]. pp. 4–24. ARM DUI 0066G. Archived (PDF) from the original on 2017-11-04.
- ^ Inc., solidThinking. "VisSim is now solidThinking Embed". www.vissim.com.
- ^ PS2 GS 유저즈 가이드, 챕터 7.1 "설명 메모"
- ^ "The TrueType Instruction Set: Data types".
- ^ "[Freetype] Why 26.6 ?".
- ^ "Dolphin Emulator". Dolphin Emulator. 15 March 2014.
- ^ "WavPack Technical Description". www.wavpack.com. Retrieved 2015-07-13.
- ^ 프랙틴트, 작은 코드
- ^ "Introduction to the Quantum Numerics Library". Retrieved 2019-11-13.
추가 정보
- Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.). Addison Wesley - Pearson Education, Inc. ISBN 978-0-321-84268-8.
외부 링크
