언제 float를 사용하고 double을 언제 사용합니까


194

프로그래밍 경험에서 자주 실수에 실수를 사용할지 두 배를 사용해야하는지 결정해야합니다. 때때로 나는 떠 다니고, 때로는 두 배로 간다. 그러나 이것은 실제로 더 주관적으로 느낀다. 내 결정을 변호하기 위해 직면한다면, 나는 정당한 이유를주지 않을 것입니다.

언제 float를 사용하고 언제 double을 사용합니까? 메모리 제약 조건이있는 경우에만 항상 double을 사용합니까? 또는 정밀도 요구 사항에 이중을 사용해야하지 않는 한 항상 부동을 사용합니까? float와 double 사이의 기본 대수의 계산 복잡성과 관련하여 실질적인 차이점이 있습니까? float 또는 double을 사용할 때의 장단점은 무엇입니까? 그리고 당신은 긴 더블을 사용 했습니까?


28
대부분의 경우 십진 부동 또는 고정 소수점 유형을 사용하지 않고 둘 다 사용하려고합니다. 이진 부동 소수점 유형은 대부분의 소수를 정확하게 나타낼 수 없습니다.
코드 InChaos

3
관련 소수점 반올림 오류 부동의 원인은 무엇? . @CodesInChaos 내 대답 은 그 결정을 내리는 데 도움이되는 리소스를 제안합니다 . 모든 솔루션에 맞는 솔루션 은 없습니다 .
Mark Booth

아주 좋은 답변을 찾았습니다 : Stack Overflow
Haris

5
"소수"는 정확히 무엇을 의미합니까? 0.01과 같은 값을 정확하게 표현 해야하는 경우 (예 : 돈) 부동 소수점이 아닙니다. 정수가 아닌 숫자를 의미하는 경우 부동 소수점은 괜찮을 것입니다. 그러나 "소수"는 필요한 것을 설명하는 가장 좋은 단어는 아닙니다.
키이스 톰슨

1
당신은 항상 선택의 여지가 없습니다. 예를 들어, Arduino 플랫폼에서 double과 float는 모두 float와 동일합니다. 실제 복식을 처리하려면 추가 기능 라이브러리를 찾아야합니다.
kiwiron

답변:


187

부동 소수점 유형의 기본 선택은입니다 double. 이 또한 접미사없이 또는 (예를 들어, 플로팅 포인트에서 작동 표준 기능 (C에서) 부동 소수점 리터럴로 얻을 유형 exp, sin등).

float 많은 부동 소수점 숫자 (수천 또는 그 이상의 순서로 생각)를 처리해야하는 경우에만 사용해야하며 알고리즘 분석에서 감소 된 범위와 정확도가 문제를 일으키지 않는 것으로 나타났습니다.

long double보다 더 많은 범위 또는 정확도가 필요 double하고 대상 플랫폼에서이를 제공 하는 경우 사용할 수 있습니다 .

요약하면, floatlong double함께, 전문가에 의해 사용을 위해 예약해야한다 double"일상"사용.


10
부동 소수점 캐싱 및 데이터 전송과 관련된 성능 문제가 없다면 수 천 개의 값에 대해 float를 고려하지 않을 것입니다. 플로트가 충분히 정확함을 보여주기 위해 분석을 수행하는 데 상당한 비용이 듭니다.
Patricia Shanahan

4
부록으로서 다른 시스템과의 호환성이 필요한 경우 동일한 데이터 유형을 사용하는 것이 유리할 수 있습니다.
zzzzBov

15
1000이 아닌 수백만 개의 부동 소수점을 사용합니다. 또한 일부 GPU는 플로트를 사용하는 것이 더 좋습니다. 특수한 경우 플로트를 사용합니다. 그렇지 않으면, 복식을 사용하십시오.
user949300

4
@PatriciaShanahan- '성능과 관련된 성능 문제 ..'좋은 예는 SSE2 또는 유사한 벡터 명령어를 사용하려는 경우 4 ops / 벡터를 부동 (vs 2)으로 수행하면 속도가 크게 향상 될 수 있습니다 ( 반은 많은 op와 반은 많은 데이터를 읽고 쓸 수 있습니다. 이것은 float 사용이 매력적으로되는 임계 값을 크게 낮추고 숫자 문제를 해결하는 데 어려움을 겪을 수 있습니다.
greggo

12
하나의 추가 조언 으로이 답변을 보증합니다. 하나는 디스플레이를 위해 RGB 값으로 작동 할 때 float육안, 디스플레이 또는 색상 시스템이 많은 정밀도를 가지지 않기 때문에 사용 (때로는 반 정밀도) 을 사용할 수 있습니다 . 이 조언은 OpenGL 등에 적용됩니다.이 추가 조언은보다 정밀한 정밀 요구 사항이있는 의료 이미지에는 적용되지 않습니다.
rwong

42

최신 컴퓨터를 대상으로하는 코드에서 double 대신 float를 사용하는 경우는 거의 없습니다. 여분의 정밀도는 반올림 오류나 다른 부정확성으로 인해 문제가 발생할 가능성을 줄입니다 (그러나 제거하지는 않습니다).

float을 사용하는 주된 이유는 다음과 같습니다.

  1. 많은 수의 배열을 저장하고 있으며 프로그램의 메모리 소비를 줄여야합니다.
  2. 배정도 부동 소수점을 기본적으로 지원하지 않는 시스템을 대상으로합니다. 최근까지 많은 그래픽 카드는 단 정밀도 부동 소수점 만 지원했습니다. 부동 소수점 지원도 제한된 저전력 및 임베디드 프로세서가 많이 있다고 확신합니다.
  3. 단 정밀도가 배정 밀도보다 빠른 하드웨어를 대상으로하고 있으며 응용 프로그램에서 부동 소수점 산술을 많이 사용합니다. 현대 인텔 CPU에서는 모든 부동 소수점 계산이 배정 밀도로 수행되므로 여기에서 아무것도 얻지 못합니다.
  4. 예를 들어 한 번에 여러 숫자로 작동하는 특수 CPU 명령어를 사용하여 저수준 최적화를 수행하고 있습니다.

따라서 기본적으로 double은 하드웨어 제한이 없거나 분석에서 배정 밀도 숫자를 저장하는 것이 메모리 사용에 크게 기여하는 것으로 보이지 않는 한 갈 길이입니다.


2
"현대 컴퓨터"는 Intel x86 프로세서를 의미합니다. 고대인들이 사용했던 일부 기계는 기본 플로트 유형으로 완벽하게 적절한 정밀도를 제공했습니다. (CDC 6600은 60 비트 워드, 48 비트 정규화 된 부동 소수점 가수, 12 비트 지수를 사용했습니다. x86이 배정도를 제공하는 것은 거의 모든 것이
아닙니다

@ John.R.Strohm : 동의했지만 C 컴파일러는 CDC6600에 없습니다. Fortran IV ...
Basile Starynkevitch

"현대 컴퓨터"란 지난 10 년 또는 2 년 동안 또는 실제로는 IEEE 부동 소수점 표준이 널리 구현 된 이후에 구축 된 모든 프로세서를 의미합니다. x86이 아닌 아키텍처가 존재한다는 것을 완벽하게 알고 있으며 내 대답을 염두에 두었습니다. 일반적으로 x86이 아닌 GPU 및 임베디드 프로세서를 언급했습니다.
user611910

그러나 그것은 사실이 아닙니다. SSE2는 한 번의 작업으로 4 개의 플로트 또는 2 개의 더블을 조작 할 수 있고, AVX는 8 개의 플로트 또는 4 개의 더블을 조작 할 수 있으며, AVX-512는 16 개의 플로트 또는 8 개의 더블을 조작 할 수 있습니다. 모든 종류의 고성능 컴퓨팅의 경우, float에 대한 수학은 x86에서 double에 대한 동일한 연산 속도의 두 배로 간주되어야합니다.
래리 그 리츠

1
프로세서 캐시에 두 배의 플로트를 두 배로 늘릴 수 있고 메모리 대기 시간이 많은 프로그램에서 주요 병목 현상이 될 가능성이 높기 때문에 그보다 훨씬 나쁩니다. 캐시에서 전체 작업 플로트를 따뜻하게 유지하는 것은 문자 그대로 더블을 사용하고 RAM에 유출시키는 것보다 훨씬 빠릅니다.
래리 그 리츠

10

double모든 계산 및 임시 변수에 사용하십시오 . float숫자 배열을 유지해야 할 때 float[](정밀도로 충분할 경우) 사용하고 수만 개 이상의 float숫자를 처리 할 때 사용하십시오 .

많은 / 대부분의 수학 함수 또는 연산자 convert / return doublefloat중간 단계 에 대해 숫자를 다시 캐스팅하고 싶지 않습니다 .

예를 들어 파일 또는 스트림에서 100,000 개의 숫자를 입력하여 정렬해야하는 경우 숫자를에 넣으십시오 float[].


5

일부 플랫폼 (ARM Cortex-M2, Cortex-M4 등)은 이중을 지원하지 않습니다 (프로세서 참조 설명서에서 항상 확인할 수 있습니다. 컴파일 경고 나 오류가없는 경우 코드가 최적이라는 의미는 아닙니다. double 은 에뮬레이션 할 수 있습니다.). 그래서 int 또는 float 을 고수해야 할 수도 있습니다 .

그렇지 않은 경우 double 을 사용 합니다.

D. Goldberg ( "모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항")의 유명한 기사를 확인할 수 있습니다. 부동 소수점 산술을 사용하기 전에 두 번 생각해야합니다. 특정 상황에서는 전혀 필요하지 않을 가능성이 큽니다.

http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf


3
이 질문은 이미 1 년 전에 이미 잘 대답했지만 ... 어쨌든 배정 밀도 FPU 가속 기능이있는 플랫폼에서 double을 사용할 때는 언제든지 다른 방법으로 사용해야한다고 말하고 싶습니다. 부동 소수점 만 사용하는 FPU를 사용하는 대신 컴파일러가 에뮬레이션하도록합니다 (FPU는 모든 플랫폼에서 필요하지는 않습니다. 실제로 Cortex-M4 아키텍처는이를 선택적 기능으로 정의합니다. ).
Selali Adobor

이 논리의 핵심은 사실은 부동 소수점 산술에 지쳐 야하고, 많은 "질투 (quiks)"여야한다는 점입니다. FPU 지원을 double로 지원하지 않으면 float 대신 double을 단순히 사용한다는 의미입니다. 플로트는 일반적으로 두 배보다 빠르며 메모리를 덜 사용합니다 (FPU 기능은 다름). 사용량이 많으면이 시점에서 조기 최적화를 수행 할 수 없습니다. 사실 복식은 많은 (아마도 대부분의) 응용 프로그램에 대해 과도하게 과잉입니다. 이 페이지의 요소는 상대 위치와 크기를 소수점 이하 13 자리 까지 계산해야 합니까?
Selali Adobor

2
오프 사이트 페이지 또는 문서에 대한 링크를 포함 할 때 관련 정보 또는 요약을 문서에서 답변으로 복사하십시오. 오프 사이트 링크는 시간이 지남에 따라 사라지는 경향이 있습니다.
Adam Zuckerman

3

실제 문제의 경우이 질문에 대답 할 때 데이터의 샘플링 임계 값이 중요합니다. 마찬가지로 노이즈 플로어도 중요합니다. 데이터 유형 선택으로 둘 중 하나를 초과하면 정밀도를 높이면 아무런 이점이 없습니다.

대부분의 실제 샘플러는 24 비트 DAC로 제한됩니다. 중요도가 24 비트 인 경우 실제 계산에서 32 비트의 정밀도가 적절해야한다고 제안합니다.

배정도는 2 배의 메모리 비용이 듭니다. 따라서 float보다 double을 사용하는 것을 제한하면 실행중인 응용 프로그램의 메모리 공간 / 대역폭을 크게 줄일 수 있습니다.


-3

float와 double 사이에서 사용할 변수의 선택은 필요한 데이터의 정확성에 달려 있습니다. 답변이 실제 답변과 무시할만한 차이를 가져야하는 경우 필요한 소수점 이하 자릿수가 많아 지므로 사용중인 소수점 이하 자릿수가 두 배가됩니다.


3
이 답변은 질문에 새로운 것을 추가하지 않으며 실제 사용에 대해서는 언급하지 않습니다.
Martijn Pieters

-5

일반적으로 나는 float돈과 같은 정밀도가 필요하지 않을 때 유형을 사용합니다 .

반면 double에 복잡한 수학 알고리즘과 같이 더 정밀해야 할 때 사용 합니다.

C99 표준은 다음과 같이 말합니다.

부동 소수점 유형에는 float, double 및 long double의 세 가지 유형이 있습니다. double 유형은 float만큼 정밀도를 제공하고 long double 유형은 double만큼 정밀도를 제공합니다. float 유형의 값 집합은 double 유형의 값 집합의 하위 집합입니다. double 유형의 값 세트는 long double 유형의 값 세트의 서브 세트입니다.

나는 실제로 사용 long double하지는 않았지만 C / C ++을 너무 많이 사용하지 않습니다. 일반적으로 파이썬과 같이 동적으로 유형이 지정된 언어를 사용하므로 유형에 신경 쓸 필요가 없습니다.

Double vs Float 에 대한 자세한 내용은 SO에서이 질문을 참조하십시오 .


25
심각한 돈 계산에 부동 소수점을 사용하는 것은 아마도 실수 일 것입니다.
Bart van Ingen Schenau

17
float는 돈에 대한 잘못된 유형입니다. 가능한 최고의 정밀도를 사용해야합니다.
ChrisF

8
@BartvanIngenSchenau 돈에 대한 부동 소수점은 보통 괜찮습니다. 이진 부동 소수점은 아닙니다. 예를 들어 .net Decimal은 부동 소수점 유형이며 일반적으로 돈 계산에 적합합니다.
코드 InChaos

13
@ChrisF 돈을 위해 "고정밀도"가 필요하지 않습니다. 정확한 값이 필요합니다.
Sean McSomething

2
@SeanMcSomething-공정한 포인트. 그러나 float는 여전히 잘못된 유형이며 대부분의 언어에서 사용할 수있는 부동 소수점 유형을 사용하면 "정확한 값"을 얻기 위해 "고정밀도"가 필요합니다.
ChrisF
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.