16 비트, 32 비트 및 64 비트 IEEE-754 시스템에서 어떤 범위의 숫자를 가지고 있습니까?
부동 소수점 숫자가 어떻게 표현에 대해 조금 알고 있습니다.
일반적인 질문은 다음과 가변합니다.
주어진 (내 목적을 위해 10 진수의 정확한 소수 자릿수)에 대해 16 비트, 32 비트 및 64 비트 IEEE-754 시스템에서 어떤 범위의 숫자를 수 있습니까?
특히 +/- 0.5 (1 자리) 또는 +/- 0.0005 (1,000 자리)까지 정확한 16 비트 및 32 비트 숫자 범위에만 관심이 있습니다.
주어진 IEEE-754 부동 소수점 숫자 X 의 경우
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 배정 밀도에서 대답하겠습니다) 1에서 2 ^ 53 사이의 모든 정수를 정확하게 표현할 수 있습니다. 2 ^ 53을 넘어서 정확히 표현할 수있는 정수는 2의 거듭 제곱을 증가시켜 간격을 나타냅니다. 예를 들면 :
- 2 ^ 53 + 2와 2 ^ 54 사이의 모든 두 번째 정수는 정확하게 표현할 수 있습니다.
- 2 ^ 54 + 4와 2 ^ 55 사이의 모든 4 번째 정수는 정확하게 표현 될 수 있습니다.
- 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 번째 정수를 정확하게 표현할 수 있습니다. . . .
정확하게 표현할 수없는 정수는 가장 가까운 표현 가능한 정수로 반올림 표현 가능한 최악의 경우 반올림은 표현 가능한 정수 사이 간격의 1/2입니다.
MSDN ref에 대한 Peter R의 링크에서 인용 된 것은 아마도 좋은 경험 법칙이지만 물론 현실은 더 복잡합니다.
"부동 소수점"의 "점"이 소수점이 아닌 이진 소수점 이라는 사실은 우리의 직관을 무너 뜨리는 방법이 있습니다. 고전적인 예는 0.1로, 십진수로 한 자리의 표현 만 필요하지만 이진수는 정확히 표현할 수 없습니다.
에 죽일 time-주말이 난 웬지 - 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항을 살펴보십시오 . 특히 정밀도 및 2 진수에서 10로 CHAPTER 2 진수 섹션에 관심이있을을 구석으로입니다 .
우선, IEEE-754-2008과 -1985에는 16 비트 부동 소수점이 없습니다. 그러나 이것은 5 비트 지수와 10 비트 분수로 제안 된 추가입니다. IEE-754는 전용 부호 비트를 사용하는 양수 및 음수 범위가 동일합니다. 또한 분수 앞에 1이 내포되어 있으므로 추가 비트를 얻습니다.
각 정수를 표현할 수있는 것처럼 1 자리에 대한 슬픈 표현 답은 매우 간단합니다. 지수는 소수점을 분수의 오른쪽 끝으로 이동합니다. 따라서 10 비트 분수는 ± 2 11을 얻습니다 .
소수점 이하 1 비트를 원하면 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 (쿼드 소식)
또한 사진
IEEE 754-1985 참조 :
참고 (1 + 분수). 으로 @bendin 진 부동 소수점을 사용하여 점을, 당신은 0.1 간단 진수 값을 표현할 수 없습니다. 의미는 간단한 추가를 여러 번 수행하거나 자르기와 같은 것을 호출하여 반올림 오류를 유발할 수 있다는 것입니다. 어떤 종류의 정밀도에 관심이 있다면이를 달성하는 유일한 방법은 기본적으로 스케일링 된 정수인 고정 소수점 십진수를 사용하는 것입니다.
귀하의 질문을 올바르게 이해했다면 귀하의 언어에 따라 다릅니다.
C #의 경우 MSDN ref를 확인하십시오 . Float는 7 자리 정밀도와 이중 15-16 자리 정밀도를가집니다.
Java에서 double을 사용할 때 계산에서 상당한 정밀도를 잃지 않는다는 것을 알아내는 데 꽤 오랜 시간이 걸렸습니다. 부동 소수점은 실제로 숫자를 매우 합리적인 정밀도로 표현하는 매우 좋은 기능을 가지고 있습니다. 내가 잃어버린 정밀도는 사용자가 입력 한 십진수 를 기본적으로 지원되는 이진 부동 소수점 표현 으로 변환하자마자 즉시 발생했습니다 . 최근에 모든 숫자를 BigDecimal로 변환하기 시작했습니다. BigDecimal은 기본 유형 중 하나가 아니기 때문에 float 또는 double보다 코드에서 처리해야 할 작업이 훨씬 더 많습니다. 그러나 다른 한편으로는 사용자가 입력하는 숫자를 정확하게 나타낼 수 있습니다.
'ProgramingTip' 카테고리의 다른 글
클래스 메서드를 호출하면 Python에서 TypeError가 발생합니다. (0) | 2020.10.29 |
---|---|
Resharper 제거 -Visual Studio가 더 이상 올바른 오류 강조 표시를 표시하지 않습니다. (0) | 2020.10.29 |
MySQL : NULL을 0으로 형변환 (0) | 2020.10.29 |
jQuery-DOM 요소가 이미 존재하는지 확인 (0) | 2020.10.29 |
twitter-bootstrap에서 .btn-group을 센터링하는 방법은 무엇입니까? (0) | 2020.10.28 |