어떤 범위의 번호를 표시할 수 있에서 16,32 비트와 64 비트 IEEE-754 시스템의 차이점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/872544

문제

내가 알고있는 방법에 대해 조금 부동 소수점 번호가 표시되지만,충분하지 않습니다,나는 두려워합니다.

일반적인 질문은:

주어진 정밀도(내 목적을 위해,수의 정확한 소수점 자리에서 기본 10),어떤 범위의 번호를 표시할 수 있 16,32 비트와 64 비트 IEEE-754 시스템의 차이점은 무엇입니까?

특히,나만 관심이 있는 범위에서 16 비트 및 32 비트 숫자를 정확+/-0.5(들이)또는+/-0.0005(의 수천 곳).

도움이 되었습니까?

해결책

주어진 IEEE-754 부동 소수점 번호 엑스, 만약에

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

그런 다음 거리 엑스 다음으로 가장 큰 부동물 포인트 번호로 (엡실론) 이다:

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.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입니다.

Peter R의 MSDN Ref 링크는 아마도 좋은 경험 법칙 일 것입니다. 물론 현실은 더 복잡합니다.

"부동 소수점"의 "포인트"가 이진 소수점이 아닌 포인트는 우리의 직관을 물리 칠 수있는 방법이 있습니다. 고전적인 예는 0.1이며, 이는 10 진수의 1 자리 만 필요하지만 바이너리에서는 정확히 표현할 수 없습니다.

주말에 죽일 주말이 있다면 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것. 아마도 섹션에 특히 관심이있을 것입니다 정도 그리고 이진에서 10 진수 변환.

첫째,어느 쪽도 IEEE-754-2008 도 -1985 이 있는 16 비트레;그러나 그것은 또한 제안된 5-bit 지수는 10 비트 부분이다.IEE-754 사용 전용입 비트,그래서 긍정적이고 부정적인 범위가 동일합니다.또한 일부는 묵시적 1 앞에서,그래서 당신은 여분의 비트입니다.

당신이 원하는 경우 정확하는 장소로서,당신은 나타낼 수 있는 각 정수,대답은 매우 간단하다:지수를 이동 소수점이 오른쪽 끝의 일부에 지나지 않는다는 것을.그래서 10 비트 부분을 가져옵 당신±211.

하려는 경우 하나의 비트는 소수점 이하,당신은 주 하나의 비트를하기 전에,그래서 당신은±210.

하나의 정밀도가 월 23 일 비트 부분,그래서 당신이 있는±224 정수입니다.

얼마나 많은 비트 정밀도 후에 필요한 소수점에 전적으로 의존한 계산을 하고 있고,얼마나 많은 일을 하는지.

  • 210 = 1,024
  • 211 = 2,048
  • 223 = 8,388,608
  • 224 = 16,777,216
  • 253 =9,007,199,254,740,992(배정밀도)
  • 2113 =10,384,593,717,069,655,257,060,992,658,440,192(quad-정밀)

또한 참조

보다 IEEE 754-1985:

v = (-1)^sign * s^(exponent-exponent_bias) * (1 + fraction)

참고 (1 + 분수). 처럼 @bendin 이진 플로팅 포인트를 사용하면 0.1과 같은 단순 소수점 값을 표현할 수 없습니다. 그 의미는 간단한 추가를 여러 번 수행하거나 잘린 것과 같은 것을 부르면 반올림 오류를 소개 할 수 있다는 것입니다. 어떤 종류의 정밀도에 관심이 있다면, 그것을 달성하는 유일한 방법은 기본적으로 스케일링 된 정수 인 고정점 소수점을 사용하는 것입니다.

귀하의 질문을 올바르게 이해하면 언어에 따라 다릅니다.
C#의 경우 확인하십시오 MSDN 참조. 플로트는 7 자리 정밀도와 이중 15-16 자리 정밀도를 갖습니다.

Java에서 복식을 사용할 때 계산이 크게 정밀도를 잃지 않았다는 것을 알아내는 데 시간이 걸렸습니다. 플로팅 포인트는 실제로 숫자를 상당히 합리적인 정밀도로 나타내는 능력이 매우 좋습니다. 내가 잃어버린 정밀도는 즉시 개종 할 때였습니다 소수 사용자가 입력 한 숫자 이진 기본적으로 지원되는 부동 소수점 표현. 최근에 모든 숫자를 BigDecimal으로 변환하기 시작했습니다. Bigdecimal은 플로트 나 복식보다 코드에서 다루기 위해 훨씬 더 많은 노력을 기울입니다. 왜냐하면 그것은 원시 유형 중 하나가 아니기 때문입니다. 그러나 반면에 사용자가 입력 한 숫자를 정확하게 표현할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top