development

'float'vs. 'double'정밀도

big-blog 2020. 6. 17. 07:42
반응형

'float'vs. 'double'정밀도


코드

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 인코딩을 사용합니다.

이 유형의 인코딩은 부호, 의미 및 지수를 사용합니다.

이 인코딩으로 인해 많은 숫자가 저장 될 수 있도록 약간의 변경이 있습니다.

또한 유효 자릿수는 10 진수가 아닌 2 진수 표현이므로 약간 변경 될 수 있습니다.

단 정밀도 (float)는 23 비트의 유효 숫자, 8 비트의 지수 및 1 개의 부호 비트를 제공합니다.

배정도 (double)는 52 비트의 유효 숫자, 11 비트의 지수 및 1 개의 부호 비트를 제공합니다.


플로트에는 항상 16 개의 유효 숫자가 있고 플로트에는 항상 7 개의 유효 숫자가 있습니까?

아니요. 복식에는 항상 53 개의 유효 비트가 있고 플로트에는 항상 24 개의 유효 비트가 있습니다 (비정규, 무한 및 NaN 값은 제외하지만 다른 질문의 대상 임). 이것들은 이진 형식이며, 이진 숫자 (비트)로 표현의 정확성에 대해서만 명확하게 말할 수 있습니다.

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

왜 복식에는 14 개의 유효 숫자가 없습니까?

double의 인코딩은 64 비트 (부호의 경우 1 비트, 지수의 경우 11 비트, 52 개의 명시 적 유효 비트 및 1 개의 암시 적 비트)를 사용하는데, 이는 부동 (32 비트)을 나타내는 데 사용되는 비트 수의 두 배 입니다.


float : 23 비트의 부호, 8 비트의 지수 및 1 개의 부호 비트.

double : 52 비트의 부호, 11 비트의 지수 및 1 개의 부호 비트.


float는 23 비트의 정밀도를 가지며 double은 52를 갖습니다.


일반적으로 기수 10이 아닌 기수 2와 지수 2의 중요한 수치를 기반으로합니다. 그러나 C99 표준에서 알 수 있듯이 float 및 double에 대해 지정된 정밀도는 없습니다 (1 및 1 + 1E-5/ 1 + 1E-7구별되어 [ floatdouble총 36]). 그러나 유효 숫자의 수는 구현 자에게 맡겨져 있습니다 (내부에서 사용하는베이스뿐만 아니라, 따라서 구현에서는베이스 3의 18 자리 정밀도를 기반으로 결정할 수 있습니다). [1]

이 값을 알아야 할 경우 상수 FLT_RADIXFLT_MANT_DIG(및 DBL_MANT_DIG/ LDBL_MANT_DIG)는 float.h에 정의됩니다.

그것이 호출되는 이유는 그것을 double저장하는 데 사용 된 바이트 수가 부동 소수점 수의 두 배이기 때문입니다 (그러나 여기에는 지수와 의미가 모두 포함됩니다). IEEE 754 표준 (대부분의 컴파일러에서 사용)은 지수보다 지수에 대해 상대적으로 더 많은 비트를 할당하므로 (23에서 9는 float대 52에서 12로 double) 정밀도가 두 배 이상인 이유입니다.

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


그것은 정확히 아니다 더블 때문에 방법의 정밀도 IEEE 754 이진 정말 소수에 잘 번역하지 않기 때문에 작동합니다. 관심이 있다면 표준을 살펴보십시오.

참고 URL : https://stackoverflow.com/questions/5098558/float-vs-double-precision

반응형