단 정밀도와 배정 밀도 부동 소수점 연산의 차이점은 무엇입니까?


169

단 정밀도 부동 소수점 연산과 배정 밀도 부동 연산의 차이점은 무엇입니까?

비디오 게임 콘솔과 관련하여 실용적인 용어에 특히 관심이 있습니다. 예를 들어, Nintendo 64는 64 비트 프로세서를 가지고 있으며 그렇다면 그렇다면 배정도 부동 소수점 연산이 가능 했습니까? PS3와 Xbox 360은 배정도 부동 소수점 연산을 할 수 있거나 단 정도만 사용할 수 있으며 일반적으로 배정도 기능 (사용하는 경우)을 사용합니다.


17
CPU가 64 비트라는 사실은 일반적으로 CPU에 64 비트 범용 레지스터 (정수)와 메모리 주소 크기가 있음을 의미 합니다. 그러나 그것은 부동 소수점 수학에 대해서는 아무 것도 말하지 않습니다. 예를 들어, Intel IA-32 CPU는 32 비트이지만 기본적으로 배정도 부동 소수점을 지원합니다.
로마 자발 로프

답변:


215

참고 : Nintendo 64 에는 64 비트 프로세서가 있습니다.

64 비트 데이터를 처리 할 때 일반적으로 64 비트 데이터 유형에 사용할 수있는 더 큰 데이터 정밀도가 필요하지 않으며 64 비트 데이터를 처리하는 데 두 배의 RAM과 캐시가 사용되므로 많은 게임에서 칩의 32 비트 처리 모드를 이용했습니다. 및 대역폭으로 인해 전체 시스템 성능이 저하됩니다.

에서 Webopedia :

배정 밀도라는 용어는 정밀도가 실제로 배가 아니기 때문에 잘못된 것입니다.
double이라는 단어는 배정 밀도 숫자가 일반 부동 소수점 숫자보다 두 배 많은 비트를 사용한다는 사실에서 파생됩니다.
예를 들어 단 정밀도 숫자에 32 비트가 필요한 경우 배정 밀도 대응 길이는 64 비트입니다.

여분의 비트는 정밀도뿐만 아니라 표현 될 수있는 크기의 범위를 증가시킵니다.
정밀도와 크기의 범위가 증가하는 정확한 양은 프로그램이 부동 소수점 값을 나타내는 데 사용하는 형식에 따라 다릅니다.
대부분의 컴퓨터는 IEEE 부동 소수점 형식으로 알려진 표준 형식을 사용합니다.

IEEE 배정도 형식은 실제로 단정도 형식 보다 두 배 이상의 정밀도를 가지며 훨씬 더 큰 범위를 갖 습니다.

로부터 부동 소수점 연산을위한 IEEE 표준

단정도

IEEE 단 정밀도 부동 소수점 표준 표현에는 32 비트 워드가 필요합니다. 32 비트 워드는 0에서 31까지 번호가 왼쪽에서 오른쪽으로 표시 될 수 있습니다.

  • 첫 번째 비트는 부호입니다 비트 S입니다.
  • 다음 8 비트는 지수 비트 'E'이며
  • 마지막 23 비트는 분수 'F'입니다.

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

단어로 표현 된 값 V는 다음과 같이 결정될 수있다 :

  • E = 255이고 F가 0이 아니면 V = NaN ( "숫자 아님")
  • E = 255이고 F가 0이고 S가 1이면 V = -Infinity
  • E = 255이고 F가 0이고 S가 0이면 V = 무한대
  • 경우 0<E<255다음 V=(-1)**S * 2 ** (E-127) * (1.F)"1.F는"1를 선도하는 암시 적 이진 지점 F를 접두사에 의해 생성 된 이진수를 나타 내기위한된다.
  • E = 0이고 F가 0이 아니면 V=(-1)**S * 2 ** (-126) * (0.F). 이들은 "비정규 화 된"값입니다.
  • E = 0이고 F가 0이고 S가 1이면 V = -0
  • E = 0이고 F가 0이고 S가 0이면 V = 0

특히,

0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0

0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity

0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN

0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5

0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127) 
0 00000000 00000000000000000000001 = +1 * 2**(-126) * 
                                     0.00000000000000000000001 = 
                                     2**(-149)  (Smallest positive value)

배정도

IEEE 배정 밀도 부동 소수점 표준 표현에는 64 비트 워드가 필요하며, 왼쪽에서 오른쪽으로 0에서 63까지 번호가 매겨져 표시 될 수 있습니다.

  • 첫 번째 비트는 부호 비트 S입니다.
  • 다음 11 비트는 지수 비트 'E'이며
  • 마지막 52 비트는 분수 'F'입니다.

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

단어로 표현 된 값 V는 다음과 같이 결정될 수있다 :

  • E = 2047이고 F가 0이 아닌 경우 V = NaN ( "숫자가 아님")
  • E = 2047이고 F가 0이고 S가 1이면 V = -Infinity
  • E = 2047이고 F가 0이고 S가 0이면 V = 무한대
  • 경우 0<E<2047다음 V=(-1)**S * 2 ** (E-1023) * (1.F)"1.F는"1를 선도하는 암시 적 이진 지점 F를 접두사에 의해 생성 된 이진수를 나타 내기위한된다.
  • E = 0이고 F가 0이 아니면 V=(-1)**S * 2 ** (-1022) * (0.F)"정규화되지 않은"값입니다.
  • E = 0이고 F가 0이고 S가 1이면 V = -0
  • E = 0이고 F가 0이고 S가 0이면 V = 0

참조 :
ANSI / IEEE 표준 754-1985,
이진 부동 소수점 산술 표준.


9
나는 당신의 출처에서 이것을 알고 있지만 "정밀도가 실제로 배가 아니기 때문에 배정 밀도라는 용어는 잘못된 것입니다."라는 문장을 좋아하지 않습니다. 요즘 단 정밀도와 배정 밀도는 IEEE에 의해 보편적으로 정의되며, 단 정밀도는 분수에서 23 비트를, 이중은 52 비트를가집니다. 기본적으로 정밀도는 2 배입니다.
Carl Walsh

5
@ZeroDivide ' **'는 지수입니다
VonC

11
@CarlWalsh 52/23! = 2 ergo "정확도의 두 배"가 아닙니다
rfoo

당신은 더에서 표준화되어 있지 않은 값에 대한 자세한 내용은이 @johnson easy68k.com/paulrsm/6502/WOZFPPAK.TXT , 또한에 stackoverflow.com/a/28801033/6309
VonC을

2
@rfoo 만약 당신이 확실한 확신을 원한다면, 정확히 두 배는 아니지만 52/2> 23이므로 네 배정도는 두 배입니다.
JShorthouse

42

나는 많은 답변을 읽었지만 double 이라는 단어의 출처 를 정확하게 설명하는 사람 은 없습니다. 몇 년 전에 대학 교수가 한 좋은 설명이 기억납니다.

VonC의 답변 스타일을 상기 한 정밀도 부동 소수점 표현은 32 비트 워드를 사용합니다.

  • 부호 1 비트 S
  • 지수 'E'에 대해 8 비트
  • 분수에 대한 24 비트 ( mantissa 또는 계수 라고도 함) (23 개만 표시됨) 그것을 'M'이라고하자 ( mantissa의 경우 ,이 이름은 "분수"가 잘못 이해 될 수 있으므로 선호합니다).

대표:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(단지 부호 비트는 첫 번째가 아니라 마지막입니다.)

더블 부동 소수점 표현 정밀도는 64 비트의 단어를 사용합니다.

  • 부호 1 비트 S
  • 지수 'E'에 대해 11 비트
  • 분수 / 가수 / 계수의 경우 53 비트 (52 개만 표시되지만), 'M'

대표:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

아시다시피, 가수 는 두 가지 유형 모두 표현에 비해 정보가 조금 더 있습니다. 실제로, 가수는 모든 비유의없이 표현 된 숫자 0입니다. 예를 들어

  • 0.000124는 0.124 × 10-3이됩니다.
  • 237.141은 0.237141 × 10 3이됩니다.

이것은 가수가 항상 형태 일 것임을 의미합니다

0.α 1 α 2 ... α t × β p

여기서 β는 표현의 기초입니다. 그러나 분수는 이진수이므로 α 1 은 항상 1과 같으므로 분수는 1로 다시 쓸 수 있습니다 . α 2 α 3 ... α t + 1 × 2 p , 암시 가정 될 수있는 초기 1 여분의 비트를위한 공간 확보 (α t + 1 ).

32의 2 배가 64라는 것은 사실이지만, 그 단어가 나오는 곳이 아닙니다.

정밀도는 있습니다 소수 자릿수를 나타냅니다 올바른 표현 오류 또는 근사치의 어떤 종류없이 즉,. 다시 말해, 얼마나 안전하게 십진수를 사용할 수 있는지 나타냅니다. 사용할 .

그렇게 말하면 안전하게 사용할 수있는 소수 자릿수를 쉽게 추정 할 수 있습니다.

  • 단정도 : log 10 (2 24 ), 약 7 ~ 8 자리
  • 배정도 : log 10 (2 53 )

19

기계의 기본적인 차이점은 배정도는 단일 비트의 두 배를 사용한다는 것입니다. 일반적인 구현에서는 단일 32 비트, 이중 64 비트입니다.

그러나 그것은 무엇을 의미 합니까? IEEE 표준을 가정하면, 단 정밀도 숫자는 가수의 약 23 비트, 최대 지수는 약 38입니다. 배정도는 가수에 대해 52 비트를 가지며 약 308의 최대 지수를 갖습니다.

자세한 내용은 평소와 같이 Wikipedia 에 있습니다.


11

여기에 모든 훌륭한 답변을 추가하려면

먼저 floatdouble 은 모두 소수를 나타내는 데 사용됩니다. 따라서 두 값의 차이는 숫자를 얼마나 정확하게 저장할 수 있는지에 달려 있습니다.

예를 들어 : 123.456789를 저장해야합니다. 하나는 123.4567 만 저장할 수 있고 다른 하나는 정확한 123.456789를 저장할 수 있습니다.

따라서 기본적으로 우리는 얼마나 정확하게 숫자를 저장할 수 있는지 알고 싶어합니다.

@Alessandro 인용

정밀도는 정확한 소수 자릿수를 나타냅니다. 즉, 어떤 종류의 표현 오류나 근사도 없습니다. 즉, 안전하게 사용할 수있는 소수 자릿수를 나타냅니다 .

Float는 분수 부분에 약 7-8 자리를 정확하게 저장할 수있는 반면 Double은 분수 부분에 약 15-16 자리를 정확하게 저장할 수 있습니다.

따라서 float는 소수 부분의 두 배 를 저장할 수 있습니다 . 그래서 Double은 float 두 배 라고 합니다.


7

"ps3 및 xbxo 360은 배정도 부동 소수점 연산을 제거 할 수 있습니까? 또는 단 정밀도 만 사용하고 일반적인 경우에는 배정도 기능을 사용합니다 (존재하는 경우)."

두 플랫폼 모두 이중 부동 소수점을 사용할 수 없다고 생각합니다. 원래 Cell 프로세서는 XBox 360 (R600)에 기반한 ATI 하드웨어와 마찬가지로 32 비트 부동 소수점 만있었습니다. 셀은 나중에 이중 부동 소수점 지원을 얻었지만 PS3가 그 칩을 사용하지 않을 것이라고 확신합니다.


5

기본적으로 단 정밀도 부동 소수점 산술은 32 비트 부동 소수점 숫자를 처리하는 반면 배정 밀도 는 64 비트를 처리합니다.

배정도의 비트 수는 저장 될 수있는 최대 값을 증가시킬뿐만 아니라 정밀도 (예 : 유효 자릿수)를 증가시킵니다.


5

모두 자세히 설명하고 추가 할 수있는 것은 없습니다. Layman의 약관 또는 일반 영어로 설명하고 싶지만

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

.....

"1.9"를 저장하거나 나타낼 수있는 변수는 1.9999를 보유하거나 나타낼 수있는 것보다 정확도가 떨어집니다. 이 분수는 큰 계산에서 큰 차이가있을 수 있습니다.


2

배정도는 숫자가 저장하는 데 단어 길이의 두 배가 걸린다는 것을 의미합니다. 32 비트 프로세서에서 단어는 모두 32 비트이므로 double은 64 비트입니다. 이것이 성능 측면에서 의미하는 것은 배정도 숫자에 대한 연산을 실행하는 데 시간이 조금 더 걸린다는 것입니다. 따라서 더 나은 범위를 얻을 수 있지만 성능이 약간 저하됩니다. 이 적중은 하드웨어 부동 소수점 단위로 약간 완화되지만 여전히 있습니다.

N64는 64 비트 프로세서 인 MIPS R4300i 기반 NEC VR4300을 사용 했지만 프로세서는 32 비트 폭의 버스를 통해 나머지 시스템과 통신합니다. 따라서 대부분의 개발자는 더 빠르기 때문에 32 비트 숫자를 사용했으며 당시 대부분의 게임에는 추가 정밀도가 필요하지 않았습니다 (따라서 부동 소수점을 두 배로 사용하지 않음).

세 가지 시스템은 작업을 부동 단일 및 이중 정밀도를 할 수 있지만 때문이 아니라 성능이 있습니다. (n64 이후 거의 모든 것이 32 비트 버스를 사용했기 때문에 ...)


1

먼저 float 및 double은 모두 소수를 나타내는 데 사용됩니다. 따라서 두 값의 차이는 숫자를 얼마나 정확하게 저장할 수 있는지에 달려 있습니다.

예를 들어 : 123.456789를 저장해야합니다. 하나는 123.4567 만 저장할 수 있고 다른 하나는 정확한 123.456789를 저장할 수 있습니다.

따라서 기본적으로 우리는 얼마나 정확하게 숫자를 저장할 수 있는지 알고 싶어합니다.

@Alessandro 인용

정밀도는 정확한 소수 자릿수를 나타냅니다. 즉, 어떤 종류의 표현 오류나 근사도 없습니다. 즉, 안전하게 사용할 수있는 소수 자릿수를 나타냅니다.

Float는 분수 부분에 약 7-8 자리를 정확하게 저장할 수있는 반면 Double은 분수 부분에 약 15-16 자리를 정확하게 저장할 수 있습니다.

따라서 double은 부동 소수점 부분의 두 배를 저장할 수 있습니다. 그래서 Double은 float 두 배라고합니다.


0

IEEE754에 따르면 • 부동 소수점 저장 표준 • 32 비트 및 64 비트 표준 (단일 정밀도 및 배정도) • 각각 8 비트 및 11 비트 지수 • 중간 결과를위한 확장 형식 (가수 및 지수 모두)


-3

단 정밀도 숫자는 32 비트를 사용하고 MSB는 부호 비트 인 반면 배정 밀도 숫자는 64 비트를 사용하고 MSB는 부호 비트입니다

단정도

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

배정도 :

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.