문제

C ++에서 다른 대신 대신에 사용하는 장단점은 무엇입니까?

도움이 되었습니까?

해결책

진정한 대답을 알고 싶다면 읽어야합니다. 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것.

요컨대 double 허용 더 높은 정밀도 그 표현에서 특정 계산을 위해 더 큰 오류. "올바른"선택은 다음과 같습니다. 필요한만큼의 정밀도를 사용하지만 더 이상 그리고 올바른 알고리즘을 선택하십시오.

많은 컴파일러는 어쨌든 "비 스트릭"모드에서 플로팅 포인트 수학을 확장합니다 (즉, 하드웨어에서 사용 가능한 더 넓은 부동 소수점 유형, 예를 들어 80 비트 및 128 비트 플로팅)도 고려해야합니다. 실제로는 할 수 있습니다 속도의 차이는 거의 보이지 않습니다 - 그들은 어쨌든 하드웨어 원주민입니다.

다른 팁

달리 할 특정 이유가 없다면 더블을 사용하십시오.

아마도 놀랍게도 C (및 C ++)의 "정상적인"부동 소수점 유형 인 플로트가 아닌 플로트가 아닙니다. 다음과 같은 표준 수학 기능 그리고 통나무 두 배를 인수로 가져 가서 복귀를 두 배로 늘리십시오. 글을 쓸 때와 같이 정상적인 부동 소수점 문자 3.14 귀하의 프로그램에는 유형이 두 배가 있습니다. 플로트가 아닙니다.

전형적인 최신 컴퓨터에서는 두 배가 플로트만큼 빠르거나 더 빠를 수 있으므로 큰 계산에 있어도 성능은 일반적으로 고려해야 할 요소가 아닙니다. (그리고 그것들은해야 할 것입니다 크기가 큰 계산 또는 성능은 마음에 들어 가지 않아야합니다. 내 새로운 I7 데스크탑 컴퓨터는 1 초 만에 60 억 개의 복식을 곱할 수 있습니다.)

이 질문은 질문에 대한 맥락이 없기 때문에 대답하기가 불가능합니다. 선택에 영향을 줄 수있는 몇 가지 사항은 다음과 같습니다.

  1. 플로트, 복식 및 긴 복식의 컴파일러 구현. C ++ 표준 상태 :

    플로트, 더블 및 긴 더블의 세 가지 부동 소수점 유형이 있습니다. 이중 유형은 플로트만큼 최소한 정밀도를 제공하며, 유형의 긴 이중은 최소한 이중만큼 정밀도를 제공합니다.

    따라서 세 가지 모두 메모리에서 같은 크기가 될 수 있습니다.

  2. FPU의 존재. 모든 CPU에 FPU가있는 것은 아니며 때로는 부동 소수점 유형이 에뮬레이션되며 때로는 부동 소수점 유형이 지원되지 않습니다.

  3. FPU 아키텍처. IA32의 FPU는 내부적으로 80 비트입니다. 32 비트, 64 비트 플로트는로드시 80 비트로 확장되어 매장에서 줄어 듭니다. 4 개의 32 비트 플로트 또는 2 개의 64 비트 플로트를 병렬로 수행 할 수있는 SIMD도 있습니다. SIMD의 사용은 표준에서 정의되지 않으므로 SIMD를 사용할 수 있는지 판단하기 위해보다 복잡한 분석을 수행하는 컴파일러가 필요하거나 특수 함수 (라이브러리 또는 내재)를 사용해야합니다. 80 비트 내부 형식의 상향은 데이터가 RAM에 얼마나 자주 저장되는지 (따라서 정밀도를 잃는)에 따라 약간 다른 결과를 얻을 수 있다는 것입니다. 이러한 이유로 컴파일러는 플로팅 포인트 코드를 특히 잘 최적화하지 않습니다.

  4. 메모리 대역폭. 더블에 플로트보다 더 많은 스토리지가 필요한 경우 데이터를 읽는 데 시간이 더 걸립니다. 그것은 순진한 대답입니다. 현대 IA32에서는 모두 데이터의 출처에 따라 다릅니다. L1 캐시에있는 경우 데이터가 단일 캐시 라인에서 나오면로드를 무시할 수 있습니다. 두 개 이상의 캐시 라인에 걸쳐 있으면 약간의 오버 헤드가 있습니다. L2에서 나온 경우 시간이 더 걸리고 RAM이 있다면 여전히 더 길어지고 마지막으로 디스크에 있으면 큰 시간입니다. 따라서 플로트 또는 더블의 선택은 데이터가 사용되는 방식보다 덜 중요합니다. 많은 순차적 데이터에 대해 작은 계산을하려면 작은 데이터 유형이 바람직합니다. 소규모 데이터 세트에서 많은 계산을 수행하면 큰 영향을 미치는 더 큰 데이터 유형을 사용할 수 있습니다. 데이터에 매우 무작위로 액세스하는 경우 데이터 크기 선택이 중요하지 않습니다. 데이터가 페이지 / 캐시 라인에로드됩니다. 따라서 RAM에서 바이트 만 원하더라도 32 바이트가 전송 될 수 있습니다 (이것은 시스템의 아키텍처에 매우 의존합니다). 이 외에도 CPU/FPU는 슈퍼 스칼라 (일명 파이프 라인) 일 수 있습니다. 따라서 부하가 여러주기가 걸릴 수 있지만 CPU/FPU는로드 시간을 어느 정도 숨기는 다른 일 (예 : 곱하기)을 하느라 바쁠 수 있습니다.

  5. 표준은 부동 소수점 값에 대한 특정 형식을 시행하지 않습니다.

사양이 있으면 최적의 선택을 안내합니다. 그렇지 않으면 사용해야 할 사항에 대한 경험이 적습니다.

더블은 더 정확하지만 8 바이트로 코딩됩니다. 플로트는 4 바이트에 불과하므로 공간이 적고 정밀도가 적습니다.

응용 프로그램에 더블과 플로트가 있으면 매우 조심해야합니다. 나는 과거에 그로 인해 버그가있었습니다. 코드의 한 부분은 Code의 나머지 부분이 Double을 사용하는 동안 Float를 사용하는 것이 었습니다. 두 배를 플로트로 복사 한 다음 플로트로 두 배로 복사하면 큰 영향을 줄 수있는 정밀 오류가 발생할 수 있습니다. 제 경우에는 화학 공장이었다.

나는 이런 종류의 버그 때문이라고 생각합니다. Ariane 6 Rocket은 몇 년 전에 폭발했습니다 !!!

변수에 사용할 유형에 대해주의 깊게 생각하십시오.

나는 병목 현상을 볼 때까지 항상 두 배로 간다. 그런 다음 플로트로 이동하거나 다른 부분을 최적화하는 것을 고려합니다.

이것은 컴파일러가 두 배를 구현하는 방법에 따라 다릅니다. Double과 Float는 동일한 유형이라는 것이 합법적입니다 (일부 시스템에 있습니다).

즉, 그들이 실제로 다르면 주요 문제는 정밀도입니다. 더블의 크기 차이로 인해 더블의 정밀도가 훨씬 높습니다. 사용중인 숫자가 일반적으로 플로트 값을 초과하는 경우 더블을 사용하십시오.

다른 여러 사람들이 성능 ISSSUES를 언급했습니다. 그것은 내 고려 사항 목록에서 정확히 마지막이 될 것입니다. 정확성은 당신의 #1 고려 사항이어야합니다.

적절한 결과를 달성하기 위해 필요한 정밀도를 사용하십시오.. 그렇다면 코드가 원하는 것만 큼 성능이 없다는 것을 알게되면 (프로파일 링을 사용 했습니까?)를 살펴보십시오.

차이점에 관계없이 (모두가 지적한대로 플로트는 공간을 덜 차지하고 일반적으로 더 빠릅니다) ... 두 배를 사용하여 성능 문제를 겪는 사람이 있습니까? 나는 더블을 사용한다고 말합니다 ... 그리고 나중에 당신이 "와우, 이것은 정말 느립니다"라고 결정하면 ... 성능 병목 현상을 찾으십시오 (아마도 당신이 두 배를 사용한 사실이 아님). 그런 다음 여전히 너무 느리면 정밀도를 희생하고 플로트를 사용할 수있는 곳을 확인하십시오.

플로트와 더블의 주요 차이점은 정밀도입니다. Wikipedia는 더 많은 정보를 가지고 있습니다단일 정밀도 (플로트) 및 이중 정밀도.

CPU에 크게 의존합니다. 가장 명백한 트레이드 오프는 정밀성과 기억 사이입니다. GBS의 RAM을 사용하면 메모리가 큰 문제가되지 않으므로 일반적으로 사용하는 것이 좋습니다. double에스.

성능은 CPU에 크게 의존합니다. floatS는 일반적으로보다 성능이 향상됩니다 double32 비트 기계에 s. 64 비트에 doubleS는 (보통) 기본 크기이기 때문에 때로는 더 빠릅니다. 그럼에도 불구하고 데이터 유형을 선택하는 것보다 훨씬 더 중요한 것은 프로세서에서 SIMD 명령을 활용할 수 있는지 여부입니다.

Double은 정밀도가 높고 플로트는 메모리를 줄이고 빠릅니다. 일반적으로 정확하지 않은 경우가없는 경우 Float를 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top