Float과 Double의 차이점 - 어느 것을 사용해야합니까?

Anonim

를 묻습니다 (참고:이 기사 독자가 컴퓨터 과학의 기초에 대해 알고 있다고 가정)

컴퓨터 과학에 등록 된 많은 초보자 프로그래머 / 학생은 컴퓨터 과학 분야의 특정 분야와 관련된 자주 묻는 질문을 질문합니다. 대부분의 초급 코스는 바이너리 , 십진법 , 8 진수 및 16 진수 를 포함하여 최신 컴퓨터에서 사용되는 숫자 시스템의 주제로 시작합니다. 시스템. 컴퓨터 (또는 계산기 및 다른 종류의 디지털 컴퓨터)의 숫자 값을 내부적으로 표현하는 컴퓨터 숫자 형식입니다. 이러한 값은 "비트 그룹화"로 저장됩니다.

우리가 알고 있듯이 컴퓨터는 2 진수 집합으로 된 데이터를 나타냅니다 (즉,

1s 0s 의 조합, 예: 1111 는 십진수로 15 를 나타냄), 계산 / 숫자 처리의 기본 블록을 구성하기 때문에 값의 동적 범위를 나타내는 데 사용되는 다양한 숫자 형식에 대해 가르치는 것이 좋습니다 어떤 종류의 작업에서도. 숫자 시스템이 교실에서 정의되면 (종종 불충분 함) 학생들은 특정 정밀도와 숫자 범위를 갖는 동일한 유형 (즉, 부동 소수점 연산 ) 내에서 다른 숫자 형식으로 이동하려고합니다. 따라서 특정 유형 간의 뉘앙스를 배워야합니다. 가장 일반적으로 사용되는 데이터 유형은 Float Double 이며, 동일한 요구 (예: 부동 소수점 연산 )를 목표로하지만, 내부 표현의 일부 차이와 프로그램의 계산에 대한 전반적인 영향. 많은 프로그래머가 Flat과 Double 데이터 유형 간의 차이를 놓치고 처음에는 사용하지 않아야하는 곳에서 오용을 일으키는 것은 불행한 일입니다. 궁극적으로 프로그램의 다른 부분에서 계산 오류가 발생합니다.

이 기사에서는 C 프로그래밍 언어의 코드 예제와 함께 float와 double의 차이점을 설명하려고합니다. 시작하자!

플로트 대 더블 … 거래가 뭐니?

Float 및 Double은 부동 소수점 산술 연산에 사용되는 데이터 표현이며 수학 수업에서 계산 한 소수의 숫자를 생각해 봅니다 (예:

20). 123 999, 999. 239, 999. 2 999 등은 정수가 아니기 때문에 (예: 2 999,999,999,999 등), 바이너리의 분수. 결과 십진수 (즉, 999.92, 12.3999, 23.2999 등)로서)는 보통의 이진 형식 (즉, 정수)으로 쉽게 표현 될 수 없다. Float과 Double의 주요 차이점은 전자는 단 정밀도 (32 비트) 부동 소수점 데이터이고 후자는 배정도 (64 비트) 부동 소수점 데이터 유형입니다. Double은 기본적으로 Float의 배정 밀도 버전이기 때문에 "double"이라고합니다. 엄청난 양을 계산할 경우 (숫자의 0이 수천이라고 생각하면) 부정확성은 Double에서 더 작아지고 많은 정확도를 잃지 않습니다.

-> - 코드 예제를 사용하여 작성하는 것이 좋습니다. 다음은 C 언어로 제공되는 수학 함수를 통해 Float 및 Double 연산입니다. #include int main () { float num1 = 1. f / 82; float num2 = 0; (int i = 0; i <738; ++ i)에 대해 num2 + = num1; printf ("%.7g n", num2); double num3 = 1. 0 / 82;

double num4 = 0; (int i = 0; i <738; ++ i)에 대해 num4 + = num3; printf ("%.15g n", num4); getchar (); } 다음을 인쇄합니다. 9. 000031

8. 99999999999983

여기서 Float 및 Double의 정밀도의 약간의 차이는 Double이 Float보다 정확 해 보이지만 다른 대답을 제공함을 알 수 있습니다.

다음은 C에서 sqrt () 함수의 예입니다. #include

#include

int main () {

float num1 = sqrt (2382719676512365.1230112312312312));

double num2 = sqrt (2382719676512365. 1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

다음 출력을 제공합니다:

48813108. 000000

48813109. 678778

여기서 Double에서의 답이 더 나은 정밀도를 가짐을 알 수 있습니다.

C에서의 몇 가지 표준 수학 함수는 Double 및 Modern 컴퓨터가 Double 부동 소수점 계산에 매우 빠르고 효율적이기 때문에 Double을 부동 소수점 산술로 사용하는 것이 좋습니다. 따라서 많은 부동 소수점 숫자 (숫자에 0이 수천 개있는 대형 배열을 생각해보십시오) 또는 이중 부동 소수점 숫자를 지원하지 않는 시스템에서 작동해야하는 경우가 아니라면 Float을 사용할 필요가 줄어 듭니다. (ARM Cortex-M2, Cortex-M4 등)은 Double을 지원하지 않으므로 Float을 사용해야합니다. 또한, 벡터 / 매트릭스 계산과 같이 특정 GPU / CPU가 플로트 처리에서 더 효율적 / 효율적으로 작동한다는 것을 기억해야합니다. 따라서 어느 것을 사용해야할지 더 자세히 결정하려면 하드웨어 사양 매뉴얼 / 문서를 살펴볼 필요가 있습니다 특정 컴퓨터에 대한.

현대 컴퓨터를 대상으로하는 코드에서 Double 대신 Float을 사용하는 경우는 거의 없습니다. Double의 추가 정밀도는 반올림 오류 또는 프로그램의 다른 부분에서 문제를 일으킬 수있는 다른 부정확성의 가능성을 줄이지 만 제거하지는 못합니다. 많은 수학 함수 또는 연산자는 Double을 변환하여 반환하므로 숫자가 Float로 캐스트 될 필요가 없습니다. 정확도가 떨어질 수 있습니다.부동 소수점 산술에 대한 자세한 분석을 위해이 멋진 기사 (http: // docs. oracle. com / cd / E19957-01 / 806-3568 / ncg_goldberg. html)를 읽는 것이 좋습니다.

요약

간단히 요약하면 다음과 같습니다.

Float을 사용해야하는 장소:

단 정밀도가 배정도보다 빠른 하드웨어를 타겟팅하는 경우.

애플리케이션에서 수천 개의 숫자가있는 수천 개의 숫자와 같이 부동 소수점 산술을 많이 사용합니다.

매우 낮은 수준의 최적화를 수행하고 있습니다. 예를 들어, 한 번에 여러 개의 숫자 / 배열 / 벡터에서 작동하는 특수 CPU 명령어 (즉, SSE, SSE2, AVX 등)를 사용하고 있습니다.

결론

결론

이 기사에서는 Float과 Double의 차이점과 특정 위치에서 사용해야하는 점을 강조했습니다. 아마도 이중 컴퓨터를 대상으로하는 경우 특히 Double 부동 소수점 산술을 사용하기 때문에 효율성이 낮을 확률은 매우 낮기 때문에 대부분의 경우 맹목적으로 Double을 사용하는 것이 좋습니다. 질문이 있으시면 아래의 코멘트 섹션에서 질문 할 수 있습니다!