이전 질문을 읽으면서 이것은 중복 질문이 아닙니다.
누구나 나를 이해하는 데 도움을 줄 수 있습니까 how float values are stored in the memory
?
내 의심은 여기에 float 값에 ‘ .'
( for example 3.45
)이 어떻게 '.'
메모리에 표시됩니까?
누구든지 다이어그램으로 나를 명확히 할 수 있습니까?
답변
소수점은 어디에도 명시 적으로 저장되지 않습니다. 그것은 디스플레이 문제입니다.
다음 설명은 단순화입니다. 중요한 세부 사항을 많이 남기고 있으며 예제는 실제 플랫폼을 나타내는 것이 아닙니다. 부동 소수점 값이 메모리에 표현되는 방식과 관련 문제를 맛볼 수 있지만 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것과 같은 권위있는 출처를 찾고 싶을 것 입니다.
밑이 10이 아닌 밑이 2 인 과학 표기법의 변형에서 부동 소수점 값을 나타내는 것으로 시작하십시오. 예를 들어 값 3.14159는 다음과 같이 나타낼 수 있습니다.
0.7853975 * 2 2
0.7853975는이다 , 유효 가수 일명; 유효 숫자를 포함하는 숫자의 일부입니다. 이 값에 밑수 2를 곱하여 2의 거듭 제곱하여 3.14159를 얻습니다.
부동 소수점 숫자는 부호와 지수 (기호 비트와 함께)를 저장하여 인코딩됩니다.
일반적인 32 비트 레이아웃은 다음과 같습니다.
3 32222222 22211111111110000000000
1 09876543 21098765432109876543210
+-+--------+-----------------------+
| | | |
+-+--------+-----------------------+
^ ^ ^
| | |
| | +-- significand
| |
| +------------------- exponent
|
+------------------------ sign bit
부호있는 정수 유형과 마찬가지로 상위 비트는 부호를 나타냅니다. 0은 양수를 나타내고 1은 음수를 나타냅니다.
다음 8 비트가 지수에 사용됩니다. 지수는 양수 또는 음수 일 수 있지만 다른 부호 비트를 예약하는 대신 10000000이 0을 나타내도록 00000000이 -128을 나타내고 11111111이 127을 나타내도록 인코딩됩니다.
나머지 비트는 의미에 사용됩니다. 각 비트는 왼쪽에서 2를 세는 음의 거듭 제곱을 나타냅니다.
2 * 01101 = 0 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * (2) -4 + 1 * 2 -5 = 0.25 + 0.125 + 0.03125 = 0.40625
일부 플랫폼에서는 significand에서 “숨겨진”선행 비트가 항상 1로 설정되어 있으므로 significand의 값은 항상 [0.5, 1) 사이입니다. 이를 통해 이러한 플랫폼은 약간 더 높은 정밀도로 값을 저장할 수 있습니다 (아래에 자세히 설명). 내 예는 이것을하지 않습니다.
따라서 3.14159의 값은 다음과 같이 표현됩니다.
0 10000010 11001001000011111100111 ^ ^ ^ | | | | | + --- 유의미 = 0.7853975 ... | | | + ------------------- 지수 = 2 (130-128) | + ------------------------- sign = 0 (양수) 값 = -1 (기호) * 2 (지수) * (유의) 값 = -1 0 * 2 2 * 0.7853975 ... 값 = 3.14159 ...
자, 유의미한 부분에 모든 비트를 더하면 총계가 0.7853975가 아님을 알 수 있습니다. 그들은 실제로 0.78539747에 나옵니다. 값을 정확하게 저장하기에는 충분한 비트가 없습니다 . 근사값 만 저장할 수 있습니다. significand의 비트 수는 정밀도 또는 저장할 수있는 유효 자릿수를 결정합니다 . 23 비트는 대략 6 자리의 정밀도를 제공합니다. 64 비트 부동 소수점 유형은 유효 범위에서 약 12 ~ 15 자리의 정밀도를 제공하기에 충분한 비트를 제공합니다. 그러나 방법에 관계없이 정확하게 표현할 수없는 값이 있다는 점당신이 사용하는 많은 비트. 1/3과 같은 값은 유한 한 소수 자릿수로 표현 될 수없는 것처럼 1/10과 같은 값은 유한 한 비트 수로 표현 될 수 없습니다. 값은 근사치이므로이를 사용한 계산도 근사치이며 반올림 오류가 누적됩니다.
지수의 비트 수에 따라 범위 (표시 할 수있는 최소 및 최대 값)가 결정됩니다. 그러나 최소값과 최대 값으로 갈수록 표현 가능한 값 사이의 간격 크기가 증가합니다. 즉, 0.785397과 0.785398 사이의 값을 정확하게 표현할 수없는 경우 7.85397과 7.85398 사이의 값 또는 78.5397과 78.5398 사이의 값 또는 785397.0과 785398.0 사이의 값을 정확하게 나타낼 수 없습니다. 매우 큰 (크기로) 숫자에 매우 작은 숫자를 곱할 때주의하십시오.
답변
는 .
전혀 저장되지 않습니다. 먼저, 고정 소수점과 정수 지수를 갖는 공학 표기법을 이해해야합니다 : 1
is 1.0 · 10 0 = 1.0E0
, 2 is 2.0E0
, 10 is 1.0E1
etc. 이것은 매우 짧은 숫자 표기법을 허용합니다. 10 억입니다 1.0E9
. 앞에있는 요소 E
는 일반적으로 고정밀 숫자로 표시 1.00000E9
됩니다. 그 결과 정밀도가 충분히 크지 않은 경우이 표기법에서 10 억 및 1 = 1,000,000,001 및 10 억 은 모두 동일합니다. 또한이 요소에는 선행 0이 필요하지 않습니다. 대신, 지수는 더 이상 그렇지 않을 때까지 감소 될 수 있습니다.
메모리에서 부동 소수점 숫자는 비슷하게 표시됩니다. 1 비트는 부호를 가지며, 일부 비트는 고정 정밀도 숫자 ( “mantissa”)로 요소를 형성하고 나머지 비트는 지수를 형성합니다. 기본 10 공학 표기법과의 중요한 차이점은 물론 이제 지수에 기본 2가 있다는 것입니다. 각 부품의 정확한 크기는 사용중인 정확한 부동 소수점 표준에 따라 다릅니다.