'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
구별되어 [ float
및 double
총 36]). 그러나 유효 숫자의 수는 구현 자에게 맡겨져 있습니다 (내부에서 사용하는베이스뿐만 아니라, 따라서 구현에서는베이스 3의 18 자리 정밀도를 기반으로 결정할 수 있습니다). [1]
이 값을 알아야 할 경우 상수 FLT_RADIX
및 FLT_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
'development' 카테고리의 다른 글
PHP를위한 최고의 XML 파서 (0) | 2020.06.17 |
---|---|
엔터티 컬렉션에 대한 IList와 IEnumerable (0) | 2020.06.17 |
AngularJS $ resource RESTful 예제 (0) | 2020.06.17 |
C # 빌드 머신을 어떻게 그리고 왜 설정합니까? (0) | 2020.06.17 |
생성자 또는 속성 설정자를 통한 종속성 주입? (0) | 2020.06.17 |