floating point - 표현 - 16-, 32- 및 64- 비트 IEEE-754 시스템에서 어떤 범위의 수를 나타낼 수 있습니까?




부동소수점 표현 범위 (5)

Java에서 double을 사용할 때, 계산에서 중요한 정밀도를 잃지 않고 있다는 것을 알기까지 꽤 오랜 시간이 걸렸습니다. 부동 소수점은 실제로 상당히 합리적인 정밀도로 숫자를 표현할 수있는 능력이 매우 뛰어납니다. 내가 잃는 정밀도는 사용자가 입력 한 10 진수 를 기본적으로 지원되는 2 진 부동 소수점 표현으로 변환하는 즉시 발생했습니다. 최근에 모든 숫자를 BigDecimal로 변환하기 시작했습니다. BigDecimal은 기본 유형 중 하나가 아니기 때문에 float 또는 double보다 코드에서 다루는 작업이 훨씬 더 많습니다. 하지만 다른 한편으로는 사용자가 입력 한 숫자를 정확히 나타낼 수 있습니다.

부동 소수점 숫자가 어떻게 표현되는지는 조금은 알고 있지만 충분하지는 않습니다. 두렵습니다.

일반적인 질문은 다음과 같습니다.

주어진 정밀도 (제 10의 정확한 소수 자리수)를 위해서, 16-, 32- 및 64- 비트 IEEE-754 시스템에서 표현할 수있는 숫자의 범위는 무엇입니까?

특히, 나는 +/- 0.5 (1 위) 또는 +/- 0.0005 (1000 위) 정확한 16 비트 및 32 비트 숫자의 범위에만 관심이 있습니다.


Peter R이 MSDN ref에 링크 된 정밀도 인용 형식은 아마도 좋은 경험 일 수 있지만 물론 현실은 더 복잡합니다.

"부동 소수점"의 "점"이 소수점이 아닌 2 진 점이라는 사실은 우리의 직관을 무너 뜨리는 한 가지 방법입니다. 고전적인 예는 0.1이며 십진수로 한 자리 수의 정밀도가 필요하지만 정확히 이진수로 표현할 수는 없습니다.

주말에 죽이면 모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항을 살펴보십시오. Precision2 진수에서 10 진수로의 변환 에 관한 섹션에 특히 관심이있을 것입니다.


부동 소수점 정수의 경우 (IEEE 배정도에 대한 답을 제공 할 것입니다.) 1에서 2 사이의 모든 정수는 정확하게 나타낼 수 있습니다. 2 ^ 53 이상에서는 정확히 표현할 수있는 정수가 2의 거듭 제곱으로 떨어져 있습니다. 예 :

  • 2 ^ 53 + 2와 2 ^ 54 사이의 모든 두 번째 정수는 정확하게 나타낼 수 있습니다.
  • 2 ^ 54 + 4와 2 ^ 55 사이의 모든 네 번째 정수는 정확하게 나타낼 수 있습니다.
  • 2 ^ 55 + 8과 2 ^ 56 사이의 모든 8 번째 정수는 정확하게 나타낼 수 있습니다.
  • 2 ^ 56 + 16과 2 ^ 57 사이의 모든 16 번째 정수는 정확하게 나타낼 수 있습니다.
  • 2 ^ 57 + 32와 2 ^ 58 사이의 모든 32 번째 정수는 정확하게 나타낼 수 있습니다.
  • 2 ^ 58 + 64와 2 ^ 59 사이의 모든 64 번째 정수는 정확히 나타낼 수 있습니다.
  • 2 ^ 59 + 128과 2 ^ 60 사이의 모든 128 번째 정수를 정확하게 나타낼 수 있습니다.
  • 2 ^ 60 + 256과 2 ^ 61 사이의 모든 256 번째 정수는 정확하게 나타낼 수 있습니다.
  • 2 ^ 61 + 512와 2 ^ 62 사이의 모든 512 번째 정수는 정확하게 나타낼 수 있습니다. . . .

정확히 표현할 수없는 정수는 가장 가까운 표현 가능한 정수로 반올림되므로 최악의 경우 반올림은 표현 가능한 정수 사이의 간격입니다.


우선, IEEE-754-2008과 -1985는 16 비트 부동 소수점을 갖지 않습니다. 5 비트의 지수와 10 비트의 비율로 제안 된 추가 기능입니다. IEE-754는 전용 부호 비트를 사용하므로 양수 범위와 음수 범위가 동일합니다. 또한 분수에는 묵시적 1이 있으므로 여분의 비트가 있습니다.

각 정수를 나타낼 수있는 것처럼 정확도를 원한다면 해답은 매우 간단합니다. 지수는 소수점을 소수점의 오른쪽 끝으로 이동시킵니다. 따라서 10 비트 분수는 ± 2 11이 됩니다.

소수점 뒤에 1 비트를 원한다면, 그 전에 한 비트를 포기하고 ± 2 10이 됩니다.

단 정밀도는 23 비트 분수이므로 ± 2 24 개의 정수를 사용할 수 있습니다.

소수점 뒤에 필요한 정밀도는 전적으로 계산 및 전적에 달려 있습니다.

  • 2 10 = 1,024
  • 2 11 = 2,048
  • 2 23 = 8,388,608
  • 2 24 = 16,777,216
  • 2 53 = 9,007,199,254,740,992 (배정 밀도)
  • 2 113 = 10,384,593,717,069,655,257,060,992,658,440,192 (4 배 정밀도)

또한보십시오


함수 EPS 대한 MATLAB 문서에서이 해답을 그리지 만 IEEE-754 부동 소수점 숫자에 보편적으로 적용해야합니다.

주어진 부동 소수점 수 X 의 경우, if

2^E <= abs(X) < 2^(E+1)

X 에서 다음으로 큰 표현 가능한 부동 소수 ( 엡실론 )까지의 거리는 다음과 같습니다.

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

위의 방정식을 사용하면 다음을 계산할 수 있습니다.

  • 반 정밀도 를 위해 ...

    정확도를 +/- 0.5 (또는 2 ^ -1)로 원하면 숫자의 최대 크기는 2 ^ 10입니다. 이것보다 크고 부동 소수점 사이의 거리가 0.5보다 큰 경우.

    정확도가 +/- 0.0005 (약 2 ^ -11) 인 경우 숫자의 최대 크기는 1입니다.이 값보다 크면 부동 소수점 숫자 사이의 거리가 0.0005보다 커집니다.

  • 단 정밀도 용 ...

    정확도가 +/- 0.5 (또는 2 ^ -1) 인 경우 숫자의 최대 크기는 2 ^ 23입니다. 이것보다 크고 부동 소수점 사이의 거리는 0.5보다 큽니다.

    정확도가 +/- 0.0005 (약 2 ^ -11) 인 경우 숫자의 최대 크기는 2 ^ 13입니다. 이것보다 크고 부동 소수점 사이의 거리가 0.0005보다 큽니다.

  • 배 정밀도 용 ...

    정확도를 +/- 0.5 (또는 2 ^ -1)로 원하면 숫자의 최대 크기는 2 ^ 52입니다. 이것보다 크고 부동 소수점 사이의 거리가 0.5보다 큰 경우.

    정확도가 +/- 0.0005 (약 2 ^ -11) 인 경우 숫자의 최대 크기는 2 ^ 42입니다. 이것보다 크고 부동 소수점 사이의 거리가 0.0005보다 큽니다.





ieee-754