대부분의 프로그래밍 언어에서 부동 소수점 숫자는 과학적 표기법 과 비슷하게 표현됩니다 . 지수와 가수 (의미라고도 함). 매우 간단한 숫자 9.2
는 실제로이 분수입니다.
5,179,139,571,476,070 * 2 -49
지수가 -49
있고 가수가있는 곳 5179139571476070
. 그것을 표현하는 것은 불가능 이유는 일부 진수이 방법은 지수와 가수 모두 정수이어야한다는 것입니다. 다시 말해, 모든 float는 정수에 2 의 정수를 곱한 정수 여야합니다 .
9.2
n 은 단순히 92/10
이지만 n 이 정수 값으로 제한 되면 10 을 2 n 으로 표현할 수 없습니다 .
데이터보기
먼저 32 비트 및 64 비트를 만드는 구성 요소를 확인 하는 몇 가지 기능이 있습니다float
. 출력에만 관심이 있다면 (파이썬의 예) 다음과 같이 광택을 내십시오.
def float_to_bin_parts(number, bits=64):
if bits == 32: # single precision
int_pack = 'I'
float_pack = 'f'
exponent_bits = 8
mantissa_bits = 23
exponent_bias = 127
elif bits == 64: # double precision. all python floats are this
int_pack = 'Q'
float_pack = 'd'
exponent_bits = 11
mantissa_bits = 52
exponent_bias = 1023
else:
raise ValueError, 'bits argument must be 32 or 64'
bin_iter = iter(bin(struct.unpack(int_pack, struct.pack(float_pack, number))[0])[2:].rjust(bits, '0'))
return [''.join(islice(bin_iter, x)) for x in (1, exponent_bits, mantissa_bits)]
이 기능에는 많은 복잡성이 있으며 설명하는 것이 매우 중요하지만 관심이 있으시면 우리 목적의 중요한 자원은 struct 모듈입니다.
파이썬 float
은 64 비트 배정도 숫자입니다. C, C ++, Java 및 C #과 같은 다른 언어에서는 배정 밀도가 별도의 유형을 가지며 double
종종 64 비트로 구현됩니다.
예를 들어 해당 함수를 호출하면 다음과 9.2
같이 얻을 수 있습니다.
>>> float_to_bin_parts(9.2)
['0', '10000000010', '0010011001100110011001100110011001100110011001100110']
데이터 해석
반환 값을 세 가지 구성 요소로 나눈 것을 볼 수 있습니다. 이러한 구성 요소는 다음과 같습니다.
- 기호
- 멱지수
- 가수 (Significand 또는 분수라고도 함)
기호
부호는 첫 번째 구성 요소에 단일 비트로 저장됩니다. 설명하기 쉽습니다 0
. float는 양수를 의미합니다. 1
그것은 부정적인 것을 의미합니다. 9.2
양수 이므로 부호 값은 0
입니다.
멱지수
지수는 중간 구성 요소에 11 비트로 저장됩니다. 우리의 경우, 0b10000000010
. 10 진수로 값을 나타냅니다 1026
. 이 구성 요소의 특질은 당신이 동일한 숫자 빼기해야한다는 것입니다 2 - 1 (비트 수) - 1 진정한 지수를 얻을 수를; 우리의 경우에, 그것은 실제 지수를 얻기 위해 0b1111111111
(소수 1023
)를 빼는 것을 의미 합니다 0b00000000011
(소수 숫자 3).
가수
가수는 세 번째 구성 요소에 52 비트로 저장됩니다. 그러나이 구성 요소에도 단점이 있습니다. 이 문제를 이해하려면 다음과 같이 과학적 표기법을 사용하십시오.
6.0221413x10 23
가수는 6.0221413
입니다. 과학적 표기법의 가수는 항상 0이 아닌 하나의 숫자로 시작합니다. 동일은 바이너리은 두 자리 숫자를 가지고 제외하고, 바이너리에 대한 진정한 보유 : 0
와 1
. 그래서 바이너리 가수는 항상 시작 1
! float가 저장 될 때 1
공간을 절약하기 위해 이진 가수 앞의가 생략됩니다. 진정한 가수 를 얻으려면 세 번째 요소 앞에 다시 배치해야 합니다 .
1.0010011001100110011001100110011001100110011001100110
세 번째 컴포넌트에 저장된 비트는 실제로 가수 지점 의 오른쪽에있는 가수 의 소수 부분을 나타 내기 때문에 단순한 추가 이상이 필요 합니다 .
십진수를 다룰 때, 우리는 10의 거듭 제곱으로 곱하거나 나눔으로써 "소수점을 움직입니다". 이진수에서는 2의 거듭 제곱으로 나눠서 같은 일을 할 수 있습니다. 하여 2 (52)는 그것을 오른쪽으로 52 곳을 이동합니다 :
0.0010011001100110011001100110011001100110011001100110
10 진법으로, 그 분할과 동일합니다 675539944105574
의해 4503599627370496
얻을 0.1499999999999999
. (이것은 정확하게 이진수로 표현 될 수 있지만 대략 10 진수로 표현 될 수있는 비율의 한 예입니다. 자세한 내용은 675539944105574/4503599627370496을 참조하십시오 .)
이제 세 번째 컴포넌트를 소수로 변환 했으므로 추가 1
하면 진정한 가수가됩니다.
구성 요소 리 캐핑
- 부호 (제 1 성분) :
0
양성, 1
음성
- 지수 (중간 구성 요소) : 빼기 2 (비트 수) 1 - - 1 진정한 지수를 얻을 수 있습니다
- 가수 (마지막 구성 요소) : 2 (비트 수)로 나누고 추가
1
하여 진정한 가수를 얻습니다.
숫자 계산
세 부분을 모두 합하면이 이진수가 부여됩니다.
1.0010011001100110011001100110011001100110011001100110 x 10 11
그러면 바이너리에서 10 진수로 변환 할 수 있습니다.
1.1499999999999999 x 2 3 ( inexact !)
9.2
부동 소수점 값으로 저장된 후 ( )로 시작한 숫자의 최종 표현을 나타내려면 곱하십시오 .
9.1999999999999993
분수로 표현
9.2
이제 숫자를 만들었으므로 간단한 분수로 재구성 할 수 있습니다.
1.0010011001100110011001100110011001100110011001100110 x 10 11
가수를 정수로 이동하십시오.
10010011001100110011001100110011001100110011001100110 x 10 11-110100
십진수로 변환 :
5179139571476070 x 2 3-52
지수를 빼십시오 :
5,179,139,571,476,070 × 2 -49
음의 지수를 나누기 :
5179139571476070/2 49
지수를 곱하십시오 :
5179139571476070 / 562949953421312
다음과 같습니다.
9.1999999999999993
9.5
>>> float_to_bin_parts(9.5)
['0', '10000000010', '0011000000000000000000000000000000000000000000000000']
이미 가수가 단지 4 자리이며 그 뒤에 0이 많이있는 것을 볼 수 있습니다. 그러나 속도를 봅시다.
이진 과학 표기법을 조립하십시오.
1.0011 x 10 11
소수점을 이동하십시오.
10011 x 10 11-100
지수를 빼십시오 :
10011 x 10-1
이진수를 십진수로 :
19 x 2-1
나누기의 음수 지수 :
19/2 1
지수를 곱하십시오 :
19/2
같음 :
9.5
추가 자료