정수에서 단일로 변환하면 정밀도가 떨어질 수 있습니다


27

나는 읽고 있었다 엄격한 전환 및 옵션을 넓히는에 대한 Microsoft의 기사 나는 부분에 도착했을 때를

다음 변환은 정밀도를 잃을 수 있습니다.

  • 정수에서 단일
  • 롱 투 싱글 또는 더블
  • 10 진수를 단일 또는 이중으로

그러나 이러한 변환은 정보 나 규모를 잃지 않습니다.

.. 이에 따라 데이터 유형과 관련된 다른 문서 ,

  • 정수 유형은 -2.147.483.648에서 2.147.483.647까지 저장할 수 있으며

  • 단일 유형에서 저장할 수 있습니다

    • 양수의 경우 1,401298E-45 ~ 3,4028235E + 38,
    • 음수의 경우 -3,4028235E + 38 ~ -1,401298E-45

.. 따라서 Single은 Integer보다 훨씬 많은 수를 저장할 수 있습니다. Integer에서 Single 로의 변환이 정밀도를 잃을 수있는 상황을 이해할 수 없었습니다. 누군가 설명해 주시겠습니까?

답변:


87

단일은 정수보다 훨씬 많은 수를 저장할 수 있습니다

아뇨. 모두 SingleInteger32 비트, 어느 모두 저장할 수 있음을 의미 동일한 수의 양, 즉 2 32 = 4,294,967,296 고유 번호.

때문에 범위 의이 Single보다 명확하게 큰, 그것 (때문에 즉시 분명하다 미루다 원리 가 있음) 가능하게 할 수없는 그 범위 내에서 모든 숫자를 나타냅니다.

그리고 범위 때문에 Integer정확히 모두 그 번호의 최대 크기와 같은 크기 IntegerSingle표시 할 수 있지만, Single가능성의 범위 내에서 모든 숫자를 표현 할 수없는 것이 분명하다, 또한 범위를 벗어나는 숫자를 나타낼 수 있습니다 Integer.

가있는 경우의 몇 가지 숫자 Integer가은에 표시 할 수없는 Single에서 변환 Integer하려면 Single 있어야 정보를 손실 할 수.


3
질문이 실제로 언제 ( "어떤 상황에서") 발생했는지 에도 불구하고 왜 그런지 설명해야 할 이유에 대한이 위대한 설명에 +1 .
doubleYou

21
@doubleYou : 4294967296 Integer(99.2 %) 중 4261412864는 으로 표현할 수 없으므로 Single"언제나"는 "항상"입니다.
Jörg W Mittag

2
더 정확하게하려면 Single4,278,190,079 개의 다른 숫자 만 나타낼 수 있습니다. Single값들을 나타내는 경우 상기 저장된 지수가 255 개 * 2 ^ 24가 있다고하지 255하는 수단 인 경우에만 Single숫자를 표현들. 이 중 두 개는 동일한 숫자 (즉, 0)를 나타내고 나머지는 모두 다른 숫자를 나타냅니다.
Tanner Swett

10
en.wikipedia.org/wiki/Single-precision_floating-point_format 은 IEEE754 바이너리 32의 한계를 잘 설명합니다. [-16777216,16777216](2 ^ 24 = 유효폭)의 정수는 정확하게 표현 될 수 있습니다. 큰 숫자는 크기에 따라 2, 4, 8, ...의 가장 가까운 배수로 반올림됩니다.
Peter Cordes

14
"이것은 둘 다 정확히 같은 양의 숫자를 저장할 수 있음을 의미합니다. "— 의미 는 아닙니다 . 두 유형 모두 정확히 동일한 개수의 각 번호를 저장하는 방법을 의미 할뿐입니다. 그리고 이것은 사실이 아닙니다. 예를 들어, Single0을 저장하는 두 가지 방법이 있습니다. 따라서 Single실제로 보다 적은 수의 고유 한 숫자를 나타낼 수 있습니다 Integer.
Konrad Rudolph

28

부동 소수점 유형 (예 : 단일 및 이중)은 부호, 가수 및 지수로 메모리에 표시됩니다. 과학적 표기법으로 생각하십시오.

Sign*Mantissa*Base^Exponent

그들은 기대할 수 있듯이 base 2를 사용합니다. 무한대와 NaN을 나타낼 수있는 다른 조정이 있으며 지수는 상쇄되고 (다시 돌아올 것입니다) 가수의 단축 (다시 돌아올 것입니다) . 자세한 내용은 해당 표현 및 작동을 다루는 표준 IEEE 754를 찾으십시오.

우리의 목적을 위해 이진 숫자 "mantissa"와 소수점을 넣을 위치를 알려주는 "지수"라고 생각할 수 있습니다.


Single의 경우 부호 1 비트, 지수 8 비트, 가수 23 비트가 있습니다.

이제 가장 중요한 자리에서 가수를 저장합니다. 왼쪽의 모든 0은 관련이 없음을 기억하십시오. 그리고 우리가 이진수로 작업하고 있음을 알면, 가장 중요한 숫자는 1입니다. 글쎄, 우리는 그것을 알고 있기 때문에 그것을 저장할 필요가 없습니다. 그 속기 덕분에 가수의 유효 범위는 24 비트입니다.

※ : 저장하는 숫자가 0이 아닌 한. 이를 위해 모든 비트를 0으로 설정합니다. 그러나 우리가 내가 설명한 설명에 따라 해석하려고하면 2 ^ 24 (암시 적 1)에 1 (2의 지수 0의 거듭 제곱)을 곱한 것입니다. 따라서 그것을 고치려면 지수 0은 특별한 값입니다. 무한대와 NaN을 지수에 저장하는 특수 값도 있습니다.

특별한 값을 피하는 것 외에도 지수 오프셋에 따라 오프셋을 사용하면 가수에 대한 부호가 없어도 가수의 시작 전에 또는 종료 후에 소수점을 배치 할 수 있습니다.


이는 큰 숫자의 경우 부동 소수점 유형이 가수의 끝을 넘어 소수점을 넣음을 의미합니다.

가수는 24 비트 숫자입니다. 절대 25 비트 숫자를 나타내지 않습니다. 추가 비트가 없습니다. 따라서 단일은 2 ^ 24와 2 ^ 24 + 1을 구별 할 수 없습니다 (이는 첫 25 비트 숫자이며 단일 비트에는 표시되지 않은 마지막 비트와 다릅니다).

따라서 정수의 경우 단일 범위는 -2 ^ 24 ~ 2 ^ 24입니다. 1에 2 ^ 24를 더하려고하면 2 ^ 24가됩니다 (유형에 관한 한 2 ^ 24와 2 ^ 24 + 1은 같은 값이므로). 온라인으로 사용해보십시오 . 정수에서 단일로 변환 할 때 정보가 손실되는 이유입니다. 그리고 이것은 또한 단일 또는 이중을 사용하는 루프가 실제로는 눈치 채지 않고 무한 루프가 될 수있는 이유입니다.


이것은 1의미에서 암시 적 선행 비트에 대한 완벽한 설명이 아닙니다 . 바이어스 지수 필드가 0이 아닌 것으로 암시 됩니다 . 포함+-0.0 하는 비정규 (일명 비정규) 0는 중요 부분이 있습니다. 나는 0.0완전히 특별한 경우를 고려 하여 단순화 할 수 있다고 생각 하지만 0.0실제로는 다른 하위 표준과 동일한 인코딩 규칙을 따릅니다.
Peter Cordes

25

여기에서 변환 할 때의 실제 예는 IntegerSingle5 잃게 정밀도 :

Single유형은 -16777216에서 16777216 (포함)의 모든 정수를 저장할 수 있지만이 범위 밖의 모든 정수를 저장할 수는 없습니다. 예를 들어 숫자 16777217을 저장할 수 없습니다.이 문제에 대해 16777216보다 큰 홀수를 저장할 수 없습니다 .

Windows PowerShell을 사용 Integer하여 a를 a 로 변환하면 어떻게되는지 확인할 수 있습니다 Single.

PS C:\Users\tanne> [int][float]16777213
16777213
PS C:\Users\tanne> [int][float]16777214
16777214
PS C:\Users\tanne> [int][float]16777215
16777215
PS C:\Users\tanne> [int][float]16777216
16777216
PS C:\Users\tanne> [int][float]16777217
16777216
PS C:\Users\tanne> [int][float]16777218
16777218
PS C:\Users\tanne> [int][float]16777219
16777220

16777217은 16777216으로 반올림되었으며 16777219는 16777220으로 반올림되었습니다.


4
그리고 규모가 커짐에 따라 가장 가까운 표현 가능 거리는 float거듭 제곱으로 계속 증가합니다. en.wikipedia.org/wiki/…
Peter Cordes

12

부동 소수점 유형은 물리학의 "과학 표기법"과 유사합니다. 숫자는 부호 비트, 지수 (승수) 및 가수 (유효 숫자)로 나뉩니다. 따라서 값의 크기가 커질수록 단계 크기도 증가합니다.

단 정밀도 부동 소수점에는 23 개의 가수 비트가 있지만 "암시 적 1"이 있으므로 가수는 사실상 24 비트입니다. 따라서 최대 2 24 크기의 모든 정수 는 단 정밀도 부동 소수점으로 정확하게 표현 될 수 있습니다.

그 위에는 더 적은 수의 숫자가 표시 될 수 있습니다.

  • 2 24 에서 2 25 까지 짝수 만 표현할 수 있습니다.
  • 2 25 에서 2 26 까지는 4의 배수 만 나타낼 수 있습니다.
  • 2 26 에서 2 27 까지는 8의 배수 만 나타낼 수 있습니다.
  • 2 27 에서 2 28 까지 16의 배수 만 나타낼 수 있습니다
  • 2 28 에서 2 29 까지 32의 배수 만 나타낼 수 있습니다
  • 2 29 에서 2 30 까지 64의 배수 만 나타낼 수 있습니다
  • 2 30 에서 2 31까지 128의 배수 만 나타낼 수 있습니다

따라서 2 32 가능한 32 비트 부호있는 정수 값 만 2 * (2 24 + 7 * 2 23 ) = 9 * 2 24 만 단 정밀도 부동 소수점으로 나타낼 수 있습니다. 전체의 3.515625 %입니다.


8

단정도 플로트는 24 비트의 정밀도를 갖습니다. 그 이상은 가장 가까운 24 비트 숫자로 반올림됩니다. 십진 과학 표기법으로 이해하는 것이 더 쉽지만 실제 부동 소수점은 이진수를 사용한다는 점을 명심하십시오.

십진수 5 자리가 있다고 가정 해 봅시다. 부호없는 일반 정수와 같은 것을 사용하여 0에서 99999 사이의 숫자를 사용할 수 있습니다. 더 큰 숫자를 나타내려면 과학적 표기법을 사용하고 두 숫자를 지수로 할당하면됩니다. 이제 0에서 9.99 x 10 99 사이의 값을 나타낼 수 있습니다 .

그러나 정확하게 표현할 수있는 가장 큰 숫자는 이제 999입니다. 12345를 나타내려고하면 1.23 x 10 4 또는 1.24 x 10 4 를 얻을 수 있지만 그 사이의 숫자는 표현할 수 없습니다. 사용 가능한 숫자가 충분하지 않습니다.


3
십진수를 사용하는 것은 이해하기 쉽도록하는 좋은 아이디어이지만 마지막 단락은 약간 오해의 소지가 있습니다. 실제로 999보다 큰 숫자 나타낼 수 있으며 예제에서 알 수 있습니다. 12300은 1.23 x 10 <sup> 4 <sup >. 당신이 의미하는 것은 그 숫자에서 시작하여 간격이 있다는 것입니다. 조금 다시 말씀해 주시겠습니까?
Fabio는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.