누구든지 메모리에서 float 표현을 설명 할 수 있습니까?


20

이전 질문을 읽으면서 이것은 중복 질문이 아닙니다.

누구나 나를 이해하는 데 도움을 줄 수 있습니까 how float values are stored in the memory?

내 의심은 여기에 float 값에 ' .'( for example 3.45)이 어떻게 '.'메모리에 표시됩니까?

누구든지 다이어그램으로 나를 명확히 할 수 있습니까?


21
가장 예상치 못한 소스 위키피디아는 어떻습니까? en.wikipedia.org/wiki/Floating_point#Internal_representation
9000

4
그리고 주요 기사를 추가 할 수 있습니다 : IEEE 부동 소수점
mouviciel

4
당신이 나와 같고 사물을 가지고 놀고, 입력을 넣고, 출력을받는 등을 배우고 싶다면이 사이트를 확인하십시오. binaryconvert.com/convert_double.html
KChaloux

다양한 부동 소수점 형식이 모두 있습니다. 오늘날 IEEE 부동 소수점이 가장 일반적이지만 이것이 유일한 것은 아닙니다. 저학년 때 CDC 6600 부동 소수점 형식을 배워야했으며 IEEE에 비해 몇 가지 장점이있었습니다. 단 정도의 경우 48 비트 가수입니다. IEEE는 단 정도에 대해 약 24 비트의 가수로 제한되기 때문에 요즘의 모든 소개 수치 방법 클래스는 학생들에게 "항상 부동하지 않고 이중을 사용합니다"라고 말합니다.
John R. Strohm

floating-point-gui.de를 참조 하고 URL을 기억 하십시오
Basile Starynkevitch

답변:


44

소수점은 어디에도 명시 적으로 저장되지 않습니다. 그것은 디스플레이 문제입니다.

다음 설명은 단순화입니다. 중요한 세부 사항을 많이 남기고 있으며 예제는 실제 플랫폼을 나타내는 것이 아닙니다. 부동 소수점 값이 메모리에 표현되는 방식과 관련 문제를 맛볼 수 있지만 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것과 같은 권위있는 출처를 찾고 싶을 것 입니다.

밑이 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 사이의 값을 정확하게 나타낼 수 없습니다. 매우 큰 (크기로) 숫자에 매우 작은 숫자를 곱할 때주의하십시오.


"하지만 다른 부호 비트를 예약하는 대신"부호있는 정수의 정확한 동작입니다.
Simon

6

.전혀 저장되지 않습니다. 먼저, 고정 소수점과 정수 지수를 갖는 공학 표기법을 이해해야합니다 : 1is 1.0 · 10 0 = 1.0E0, 2 is 2.0E0, 10 is 1.0E1etc. 이것은 매우 짧은 숫자 표기법을 허용합니다. 10 억입니다 1.0E9. 앞에있는 요소 E는 일반적으로 고정밀 숫자로 표시 1.00000E9됩니다. 그 결과 정밀도가 충분히 크지 않은 경우이 표기법에서 10 억 및 1 = 1,000,000,001 및 10 억 은 모두 동일합니다. 또한이 요소에는 선행 0이 필요하지 않습니다. 대신, 지수는 더 이상 그렇지 않을 때까지 감소 될 수 있습니다.

메모리에서 부동 소수점 숫자는 비슷하게 표시됩니다. 1 비트는 부호를 가지며, 일부 비트는 고정 정밀도 숫자 ( "mantissa")로 요소를 형성하고 나머지 비트는 지수를 형성합니다. 기본 10 공학 표기법과의 중요한 차이점은 물론 이제 지수에 기본 2가 있다는 것입니다. 각 부품의 정확한 크기는 사용중인 정확한 부동 소수점 표준에 따라 다릅니다.


3
이것은 "과학 표기법"입니다. "엔지니어링 표기법"은 지수가 3의 배수로 제한되는 경우입니다.
Clement J.

7
베이스 2가 사용되는 것이 매우 중요합니다. 이 값이 정확히 저장 될 수있는 결정하는 것은 아닙니다, 당신은에 대한 직관 개발을 방해 할 수없는 경우에도 어떤 값이 최소한 그 진수가 완전히 쓸모을 기억해야한다 (내가 할 수없는 알을) 수레에 대한 생각의 방법.

1
@delnan : 도움이되면 가수의 각 비트는 상위 비트의 절반입니다. 따라서 float는 가수의 한계까지 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 등의 음의 힘의 합을 저장할 수 있습니다. . 그래서 32 비트의 엡실론은 float이다 2^-22 * exponent, 또는 사백십구만사천삼백사분의 일에 대해합니다.
greyfade
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.