대부분의 프로그래밍 언어에서 부동 소수점 숫자는 과학적 표기법 과 비슷하게 표현됩니다 . 지수와 가수 (의미라고도 함). 매우 간단한 숫자 9.2는 실제로이 분수입니다.
5,179,139,571,476,070 * 2 -49
지수가 -49있고 가수가있는 곳 5179139571476070. 그것을 표현하는 것은 불가능 이유는 일부 진수이 방법은 지수와 가수 모두 정수이어야한다는 것입니다. 다시 말해, 모든 float는 정수에 2 의 정수를 곱한 정수 여야합니다 .
9.2n 은 단순히 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
추가 자료