내 프로그래밍 경험에서 자주 사용하는 경우 float 또는 double을 실제 사용하는 경우 결정해야합니다. 번호. 때로는 플로트를 선택하고 때로는 더블을 선택하지만 실제로는 더 주관적으로 느껴집니다. 내 결정을 옹호하기 위해 직면하게된다면 건전한 이유를 제시하지 않을 것입니다.

언제 float를 사용하고 언제 double을 사용합니까? 메모리 제약이있을 때만 항상 double을 사용합니까? 아니면 정밀도 요구 사항이 double을 사용하도록 요구하지 않는 한 항상 float를 사용합니까? float와 double 사이의 기본 arithemtics의 계산 복잡성과 관련하여 상당한 차이가 있습니까? float 또는 double 사용의 장단점은 무엇입니까? long double도 사용 했습니까?

Comments

  • 대부분의 경우 둘 다 사용하지 않고 십진 부동 소수점 또는 고정 소수점 유형을 사용하고 싶습니다. 바이너리 부동 소수점 유형은 ‘ 대부분의 소수를 정확하게 나타낼 수 없습니다.
  • 부동 소수점 반올림 오류의 원인 ? . @CodesInChaos 내 답변 에는 그러한 결정을 내리는 데 도움이되는 리소스가 제안되어 있지만 일률적 인 솔루션은 없습니다.
  • ” 소수점 “이 정확히 무엇을 의미합니까? 0.01과 같은 값을 정확하게 표현해야하는 경우 (예 : 돈을 위해), (이진) 부동 소수점은 답이 아닙니다. 단순히 정수가 아닌 숫자를 의미하는 경우 부동 소수점은 괜찮을 가능성이 있지만 ” 소수점 “은 최고의 단어가 아닙니다. 필요한 것을 설명합니다.
  • (현재 현재) 대부분의 그래픽 카드가 doubles 이상의 부동 소수점을 허용한다는 점을 고려하면 그래픽 프로그래밍은 종종 단 정밀도를 사용합니다.
  • 당신은 ‘ 항상 선택할 수있는 것은 아닙니다. 예를 들어, Arduino 플랫폼에서 double과 float는 모두 float에 해당합니다. 실제 복식을 처리하려면 추가 기능 라이브러리를 찾아야합니다.

Answer

부동 소수점 유형은 double 여야합니다. 또한 접미사가없는 부동 소수점 리터럴 또는 부동 소수점 숫자에서 작동하는 표준 함수 (예 : exp, 등).

float는 많은 부동 소수점 숫자에 대해 작업해야하는 경우에만 사용해야합니다 ( 수천 개 이상) 및 알고리즘 분석 결과 감소 된 범위와 정확도가 문제가되지 않는 것으로 나타났습니다.

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

요약하면 floatlong double는 “매일”사용을 위해 double와 함께 전문가 용으로 예약되어야합니다.

코멘트

  • 부동 소수점 cachin과 관련된 성능 문제가 없다면 수천 개의 값에 대해 float를 고려하지 않을 것입니다. g 및 데이터 전송. 일반적으로 float가 충분히 정확한지 분석을 수행하는 데 상당한 비용이 듭니다.
  • 부록으로 다른 시스템과의 호환성이 필요한 경우 동일한 데이터 유형을 사용하는 것이 유리할 수 있습니다.
  • li>
  • ‘ 1000이 아닌 수백만 개의 숫자에 부동 소수점을 사용합니다. 또한 일부 GPU는 부동 소수점을 사용하는 것이 더 좋습니다. 특수한 경우 부동 소수점을 사용합니다. 그렇지 않으면 복식을 사용합니다.
  • @PatriciaShanahan-‘ 관련된 성능 문제 .. ‘ A 좋은 예는 SSE2 또는 유사한 벡터 명령어를 사용하려는 경우 float로 4 개의 ops / vector를 수행 할 수 있습니다 (vs 2 per double). 이는 상당한 속도 향상을 제공 할 수 있습니다 (반은 많은 연산과 절반은 읽을 데이터 & 쓰기). 이렇게하면 플로트를 사용하는 것이 매력적이며 숫자 문제를 분류하는 데 어려움을 겪을 가치가있는 임계 값을 상당히 낮출 수 있습니다.
  • 나는이 답변을 한 가지 추가 조언으로 승인합니다. 디스플레이를 위해 RGB 값으로 작업 할 때 float (때로는 반정도)를 사용하는 것이 허용됩니다. 사람의 눈, 디스플레이 또는 색상 시스템이 그다지 많은 정밀도를 가지고 있지 않기 때문입니다. 이 조언은 OpenGL 등에 적용 할 수 있습니다.이 추가 조언은 더 엄격한 정밀도 요구 사항이있는 의료 이미지에는 적용되지 않습니다.

Answer

최신 컴퓨터를 대상으로하는 코드에서 double 대신 float를 사용하는 경우는 거의 없습니다. 추가 정밀도는 반올림 오류 또는 기타 부정확성으로 인해 문제가 발생할 가능성을 줄이지 만 제거하지는 않습니다.

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

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

따라서 기본적으로 double은 하드웨어 제한이 없거나 분석 결과 배정 밀도 숫자 저장이 메모리 사용량에 크게 기여하는 것으로 확인되지 않는 한 진행됩니다.

댓글

  • ” 최신 컴퓨터 “는 Intel x86 프로세서를 의미합니다. 고대인이 사용한 일부 기계는 기본 플로트 유형으로 완벽하게 적절한 정밀도를 제공했습니다. (CDC 6600은 60 비트 워드, 48 비트 정규화 된 부동 소수점 가수, 12 비트 지수를 사용했습니다. x86이 배정 밀도를 위해 제공하는 거의 ‘입니다.)
  • @ John.R.Strohm : 동의했지만 C 컴파일러는 CDC6600에 존재하지 않았습니다. Fortran IV였습니다 …
  • ” 최신 컴퓨터 “는 지난 10 년 동안 구축 된 모든 프로세서를 의미합니다. IEEE 부동 소수점 표준이 널리 구현 되었기 때문입니다. 저는 ‘ 비 x86 아키텍처가 존재한다는 것을 완벽하게 알고 있으며이를 염두에 두었습니다. 일반적으로 x86이 아닌 GPU와 임베디드 프로세서를 언급했습니다.
  • 하지만 ‘는 사실이 아닙니다. SSE2는 한 번의 작업으로 4 개의 플로트 또는 2 개의 더블을 조작 할 수 있으며, AVX는 8 개의 플로트 또는 4 개의 더블을 조작 할 수 있으며, AVX-512는 16 개의 플로트 또는 8 개의 더블을 조작 할 수 있습니다. 모든 종류의 고성능 컴퓨팅의 경우 float에 대한 수학은 x86의 double에 대한 동일한 작업 속도의 두 배로 간주되어야합니다.
  • 그리고 ‘ s 그보다 더 나쁜 것은 두 배로 할 수있는 것보다 두 배나 많은 플로트를 프로세서 캐시에 넣을 수 있고 메모리 대기 시간이 많은 프로그램에서 주요 병목 현상이 될 가능성이 있기 때문입니다. 전체 작업 집합을 캐시에서 따뜻하게 유지하는 것은 double을 사용하여 RAM으로 유출하는 것보다 말 그대로 훨씬 더 빠를 수 있습니다.

Answer

모든 계산 및 임시 변수에 double를 사용합니다. 숫자 배열을 유지해야하는 경우 float를 사용합니다.-float[] (정밀도가 충분한 경우), 수십 개가 넘는 수천 개의 float 숫자.

많은 / 대부분의 수학 함수 또는 연산자가 double를 변환 / 반환합니다. t 중간 단계를 위해 숫자를 다시 float로 캐스트하려고합니다.

예 : 파일 또는 스트림에서 100,000 개의 숫자를 입력 한 경우 정렬하고 float[]에 숫자를 입력하세요.

답변

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

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

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

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

댓글

  • 이 질문은 1 년 전에 이미 꽤 잘 답변되었습니다 …하지만 어쨌든 ‘ ‘ 배정 밀도 FPU 가속이있는 플랫폼에서 double을 사용할 때마다 부동 소수점 만있는 FPU를 활용하는 대신 컴파일러에서 에뮬레이트하도록 허용하는 경우에도 마찬가지입니다 (FPU ‘는 ‘ 모든 플랫폼에서도 필요하지 않습니다. 실제로 Cortex-M4 아키텍처는이를 선택적 기능으로 정의합니다 [M2가 오타였습니까?]).
  • 이 논리의 핵심은 다음과 같습니다. ‘ 진정한 것은 부동 소수점 산술이 지겨워 야하며 ‘의 많은 ” 특징 “, 복식에 대한 FPU 지원의 존재는 단순히 수레 대신 복식을 사용한다는 것을 의미하지는 않습니다. 부동 소수점은 일반적으로 double보다 빠르고 메모리를 덜 사용합니다 (FPU 기능은 다양 함). 사용량의 양으로 인해이 시점이 조기 최적화에 있지 않습니다. 사실 두 배는 많은 (아마도 대부분의) 응용 프로그램에서 분명히 과잉입니다. 이 페이지에있는 요소의 상대적 위치와 크기를 소수점 이하 13 자리로 계산해야합니까?
  • 오프 사이트 페이지 또는 문서에 대한 링크를 포함 할 때 관련 정보 또는 요약을 문서에서 답변에 추가합니다. 오프 사이트 링크는 시간이 지남에 따라 사라지는 경향이 있습니다.

답변

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

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

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

Answer

float와 double 사이에 사용할 변수는 필요한 데이터의 정확성에 따라 다릅니다. 실제 답과 약간의 차이가있는 답이 필요한 경우 소수점 이하 자릿수가 많을수록 이중 사용이 결정되고, 부동 소수점은 소수 자릿수 일부를 잘라 정확도를 떨어 뜨립니다.

댓글

  • 이 답변은 질문에 새로운 내용을 추가하지 않으며 ‘ 실제 사용에 대해 언급하지 않습니다.

Answer

보통 다음과 같은 경우 float 유형을 사용합니다. 예를 들어 돈에 대해서는 정밀도가 많이 필요하지 않습니다. 이것은 잘못되었지만 제가 잘못 사용하는 데 익숙합니다.

다른 한편으로는 복잡한 수학적 알고리즘과 같이 더 많은 정밀도가 필요할 때.

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

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

,하지만 저는 C / C ++를 그렇게 많이 사용하지 않습니다. 일반적으로 저는 Python과 같은 동적 유형 언어를 사용합니다. 여기서 유형에 대해 신경 쓸 필요가 없습니다.

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

댓글

  • 진지한 돈 계산에 부동 소수점을 사용하는 것은 아마도 실수 일 것입니다.
  • float는 정확히 돈에 대해 잘못된 유형입니다. 가능한 한 가장 높은 정밀도를 사용해야합니다.
  • @BartvanIngenSchenau 돈에 대한 부동 소수점은 일반적으로 괜찮지 만 이진 부동 소수점은 그렇지 않습니다. 예를 들어 .net ‘의 Decimal는 부동 소수점 유형이며 일반적으로 ‘ 금전 계산에 적합합니다.
  • @ChrisF ‘ ” 고정밀도 ” 돈을 위해 정확한 가치가 필요합니다.
  • @SeanMcSomething-그럴듯합니다. 그러나 부동 소수점은 여전히 잘못된 유형이며 대부분의 언어에서 사용할 수있는 부동 소수점 유형을 고려할 때 ” 고정밀도 “가 필요합니다. div id = “755ad77b54”>

정확한 값 “.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다