programing

'더블' 대 '더블' 정밀도

bestcode 2022. 8. 16. 23:23
반응형

'더블' 대 '더블' 정밀도

코드

float x  = 3.141592653589793238;
double z = 3.141592653589793238;
printf("x=%f\n", x);
printf("z=%f\n", z);
printf("x=%20.18f\n", x);
printf("z=%20.18f\n", z);

결과물을 얻을 수 있습니다.

x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116

의 세 줄에 .741012573242, 네 줄에 .116 은 항상 이고, 예요?복식은 항상 16자리이고 플로트는 항상 7자리입니까?14살 때요?

C 의 부동소수점 번호는 IEEE 754 부호화를 사용합니다.

이런 유형의 부호화에서는 부호, 유의어 및 지수를 사용합니다.

이 부호화 때문에, 많은 번호에 작은 변경이 가해져 격납이 가능하게 됩니다.

또한 유효 자릿수는 소수점이 아닌 2진수 표현이기 때문에 약간 변경될 수 있습니다.

단일 정밀도(플로트)는 23비트, 8비트 지수 및 1개의 부호 비트를 제공합니다.

이중 정밀도(이중)는 유의 및 52비트, 지수 11비트 및 부호 비트 1개를 제공합니다.

복식은 항상 16자리이고 플로트는 항상 7자리입니까?

아니요. 복수는 항상 53개의 유효 비트를 가지며 플로트는 항상 24개의 유효 비트를 갖습니다(단, 소수, 무한 및 NaN 값은 제외하지만 그것들은 다른 질문의 대상입니다).이것들은 바이너리 형식이며, 바이너리 디짓(비트)의 관점에서만 그 표현의 정밀도에 대해 명확하게 말할 수 있습니다.

이는 이진수 정수에 저장할 수 있는 자릿수의 문제와 유사합니다.부호 없는 32비트 정수는 최대 32비트의 정수를 저장할 수 있습니다.정수는 소수 자릿수에 정확하게 매핑되지 않습니다.최대 9자리수의 정수는 모두 저장할 수 있지만 10자리수의 많은 숫자도 저장할 수 있습니다.

왜 복식에는 14개의 유의한 숫자가 없나요?

이중 부호화에서는 64비트(부호의 경우 1비트, 지수의 경우 11비트, 명시적 유효 비트 52비트 및 암묵적 비트 1비트)가 사용됩니다.이는 플로트를 나타내는 데 사용되는 비트 수(32비트)의 2배입니다.

  • float: 23 、 8 、 1 、 1 。
  • double: 52 ( ),), ) 、 11 ( 트 bit ) 、 1 ( bit bit ) 。

보통 지수 및 유의값의 유의한 숫자와 10이 아닌 2를 기준으로 합니다.규격에서 알 수 한, 있지 않습니다(과 C99의 C99가 이라는 점 이외).1 + 1E-5/1 + 1E-7구별할 수 있다[float그리고.double(반복적으로)다만, 중요한 수치는 실장자에게 맡겨져 있습니다(또, 내부적으로 사용하는 베이스도 있기 때문에, 실장에서는 베이스 3의 18 자리수의 정밀도에 근거해 결정할 수 있습니다).[1]

이러한 값을 알아야 하는 경우FLT_RADIX그리고.FLT_MANT_DIG(그리고DBL_MANT_DIG/LDBL_MANT_DIG)는 float.h에 정의되어 있습니다.

이게 왜...double저장에 사용되는 바이트 수가 플로트 수의 두 배이기 때문입니다(단, 여기에는 지수 및 significant가 모두 포함됩니다).IEEE 754 표준(대부분의 컴파일러에서 사용)에서는, 에 대해서, 지수(23 ~9)보다 상대적으로 많은 비트를 할당합니다.float52~12에 비해double그 때문에 정밀도가 2배 이상 향상되었습니다.

1: 섹션 5.2.4.2 (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf )

IEEE 754의 작동 방식과 바이너리가 10진수로 잘 변환되지 않기 때문에 정확히 배의 정밀도는 아닙니다.관심있으면 그 기준을 보세요.

플로트는 정밀도가 23비트이고 더블은 52비트입니다.

언급URL : https://stackoverflow.com/questions/5098558/float-vs-double-precision

반응형