플로트가 3,000,000,000 및 3,000,000,256을 나타낼 수 있지만 그 사이에는 아무 것도 없는 이유는 무엇입니까?

4909 단어 float
처음에는 이해할 수 없는 Programming C# 8.0 책에서 설명을 읽었습니다. 여기에 인용했습니다.
As floating-point numbers get larger, the values that can be represented get farther apart—a float can represent 3,000,000,000 and also 3,000,001,024, but nothing in between.


우리 모두는 int와 같은 정수 데이터 유형이 연속적인 숫자를 저장할 수 있다는 것을 알고 있습니다. Float는 정수뿐만 아니라 분수가 포함된 숫자도 저장할 수 있습니다. float가 중간 숫자를 나타낼 수 없는 이유는 무엇입니까? 3,000,000,001?

먼저 float가 메모리에서 3,000,000,000을 어떻게 나타내는지 살펴보겠습니다. float는 4바이트로 구성됩니다. 전체 비트는 세 부분으로 나뉩니다.



비트 번호
크기
분야 명




31
1비트
표지판)


23-30
8비트
지수(E)


0-22
23비트
가수(M)



값을 계산하는 공식은 (-1)S × (1.0 + 0.M) × 2E-바이어스입니다.
수식에 사용된 편향은 float 데이터 유형에 대해 127로 정의됩니다.

C# 코드 조각을 사용하여 바이트를 찾습니다.

using System;

namespace FundamentalDataTypes
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(BitConverter.IsLittleEndian); // get the endianness

            byte[] bytes = BitConverter.GetBytes(3_000_000_000F);
            foreach (byte b in bytes)
            {
                Console.WriteLine(Convert.ToString(b, 2).PadLeft(8, '0'));
            }

        }
    }
}


출력은 다음과 같습니다.
진실
01011110
11010000
00110010
01001111

올바른 순서로 바이트를 어셈블할 수 있도록 엔디안을 알아야 합니다. 출력의 첫 번째 줄에 있는 True는 엔디안이 Little Endian이므로 출력의 두 번째 줄에 있는 첫 번째 바이트가 값의 최하위 바이트임을 의미합니다.



S = 0(이 숫자는 양수임)
E = 158
M = 0.01100101101000001011110
공식 (-1)0 × (1.01100101101000001011110) × 231을 사용하여 최종 비트 1011 0010 1101 0000 0101 1110 0000 0000을 얻을 수 있으며 이는 부호 없는 정수에 저장된 것과 정확히 동일합니다.



unsigned int에서 위의 비트를 분석해 봅시다. 위치 31의 첫 번째 비트는 float에 내재된 1입니다. 합이 23비트인 위치 30에서 8까지의 비트는 플로트의 가수를 구성합니다. 중간 숫자는 위치 7에서 0까지의 비트를 사용합니다. 그러나 마지막 8비트는 지수를 수용하기 위해 float가 8비트를 별도로 설정해야 하기 때문에 float로 표현할 수 없습니다. 이것이 float가 3,000,000,001을 정확하게 나타낼 수 없는 이유입니다.

float로 정확하게 표현할 수 있는 3,000,000,000 이후의 다음 숫자는 위 비트의 위치 8에 있는 비트를 1로 설정하여 얻습니다.
3,000,000,256.



그 사이의 숫자는 대략 3,000,000,000 또는 3,000,000,256(3,000,001,024, 책의 오류가 아님)에 가깝습니다.

참조



https://en.wikipedia.org/wiki/Endianness
https://www.doc.ic.ac.uk/~eedwards/compsys/float

좋은 웹페이지 즐겨찾기