C ++에서 다른 하나를 사용하는 것의 장점과 단점은 무엇입니까?
답변:
진정한 답을 알고 싶다면 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항을 읽어야 합니다.
요컨대, 표현에서 더 높은 정밀도 를 double
허용 하지만 특정 계산의 경우 더 큰 오류가 발생합니다 . "올바른"선택이 될 것입니다 : 많은 정밀도로 사용하기는하지만 더 필요로 하고 올바른 알고리즘을 선택합니다 .
어쨌든 많은 컴파일러는 "비 엄격"모드에서 확장 부동 소수점 연산을 수행합니다 (즉, 하드웨어에서 사용할 수있는 더 넓은 부동 소수점 유형 (예 : 80 비트 및 128 비트 부동) 사용),이 점도 고려해야합니다. 실제로 속도의 차이를 거의 볼 수 없습니다 . 어쨌든 하드웨어의 기본입니다.
double
경우) 사용하십시오. 대부분의 경우 더 안전합니다.
특별한 이유가 없다면 double을 사용하십시오.
놀랍게도 C (및 C ++)의 "일반"부동 소수점 유형은 double이며 float가 아닙니다. sin 및 log 와 같은 표준 수학 함수 는 인수로 double을 취하고 double을 반환합니다. 프로그램에서 3.14 를 작성할 때와 같은 일반 부동 소수점 리터럴 은 double 유형을 갖습니다. 플로트가 아닙니다.
일반적인 현대 컴퓨터에서 double은 float만큼 빠르거나 더 빠를 수 있으므로 대규모 계산에서도 성능은 일반적으로 고려할 요소가 아닙니다. (그리고 그것들은 큰 계산이되어야합니다. 그렇지 않으면 성능이 마음에 들지 않아야합니다. 나의 새로운 i7 데스크탑 컴퓨터는 1 초에 60 억 배의 두 배를 할 수 있습니다.)
이 질문에는 맥락이 없기 때문에 대답하기가 불가능합니다. 선택에 영향을 미칠 수있는 몇 가지 사항은 다음과 같습니다.
float, double 및 long double의 컴파일러 구현. C ++ 표준은 다음과 같이 설명합니다.
부동 소수점 유형에는 float, double 및 long double의 세 가지가 있습니다. double 유형은 적어도 float만큼 정밀도를 제공하고 long double 유형은 적어도 double만큼 정밀도를 제공합니다.
따라서 세 가지 모두 메모리에서 동일한 크기가 될 수 있습니다.
FPU의 존재. 모든 CPU에 FPU가있는 것은 아니며 때로는 부동 소수점 유형이 에뮬레이션되고 때로는 부동 소수점 유형이 지원되지 않는 경우도 있습니다.
FPU 아키텍처. IA32의 FPU는 내부적으로 80 비트입니다. 32 비트 및 64 비트 플로트는로드시 80 비트로 확장되고 저장시 축소됩니다. 4 개의 32 비트 플로트 또는 2 개의 64 비트 플로트를 병렬로 수행 할 수있는 SIMD도 있습니다. SIMD 사용은 표준에 정의되어 있지 않으므로 SIMD를 사용할 수 있는지 확인하기 위해 더 복잡한 분석을 수행하거나 특수 함수 (라이브러리 또는 내장 함수)를 사용해야하는 컴파일러가 필요합니다. 80 비트 내부 형식의 결론은 데이터가 RAM에 저장되는 빈도에 따라 약간 다른 결과를 얻을 수 있다는 것입니다 (따라서 정밀도가 떨어짐). 이러한 이유로 컴파일러는 부동 소수점 코드를 특히 잘 최적화하지 않습니다.
메모리 대역폭. double이 float보다 더 많은 저장 공간을 필요로하는 경우 데이터를 읽는 데 더 오래 걸립니다. 순진한 대답입니다. 최신 IA32에서는 모든 데이터가 어디에서 오는지에 따라 다릅니다. L1 캐시에있는 경우 데이터가 단일 캐시 라인에서 오는 경우로드는 무시할 수 있습니다. 둘 이상의 캐시 라인에 걸쳐 있으면 약간의 오버 헤드가 있습니다. L2의 경우 시간이 오래 걸리고 RAM에 있으면 더 오래 걸리고 마지막으로 디스크에 있으면 엄청난 시간이 걸립니다. 따라서 float 또는 double의 선택은 데이터가 사용되는 방식보다 덜 중요합니다. 많은 순차 데이터에 대해 작은 계산을 수행하려는 경우 작은 데이터 유형이 바람직합니다. 작은 데이터 세트에 대해 많은 계산을 수행하면 더 큰 데이터 유형을 사용하여 큰 효과를 얻을 수 있습니다. 만약 너라면' 데이터에 매우 무작위로 다시 액세스하면 데이터 크기 선택이 중요하지 않습니다. 데이터는 페이지 / 캐시 라인에로드됩니다. 따라서 RAM에서 1 바이트 만 원하는 경우에도 32 바이트를 전송할 수 있습니다 (시스템 아키텍처에 따라 매우 다름). 무엇보다 CPU / FPU는 수퍼 스칼라 (일명 파이프 라인) 일 수 있습니다. 따라서로드에 여러주기가 걸릴 수 있지만 CPU / FPU는로드 시간을 어느 정도 숨기는 다른 작업 (예 : 곱하기)을 수행 하느라 바쁠 수 있습니다.
표준은 부동 소수점 값에 대해 특정 형식을 적용하지 않습니다.
사양이있는 경우 최적의 선택을 안내합니다. 그렇지 않으면 무엇을 사용할지 경험해야합니다.
Double이 더 정확하지만 8 바이트로 코딩됩니다. float는 4 바이트에 불과하므로 공간과 정밀도가 떨어집니다.
응용 프로그램에 double 및 float가있는 경우 매우주의해야합니다. 나는 과거에 그것 때문에 버그가 있었다. 코드의 한 부분은 float를 사용하고 나머지 코드는 double을 사용했습니다. double을 float로 복사 한 다음 float를 double로 복사하면 큰 영향을 줄 수있는 정밀도 오류가 발생할 수 있습니다. 제 경우에는 화학 공장 이었어요 ... 바라건대 극적인 결과가 없었 으면합니다 :)
아리안 6 로켓이 몇 년 전에 폭발 한 것은 이런 종류의 버그 때문이라고 생각합니다 !!!
변수에 사용할 유형을 신중하게 생각하십시오.
적절한 결과를 얻기 위해 필요한 정밀도를 사용하십시오 . 그런 다음 코드가 원하는대로 수행되지 않는 경우 (프로파일 링을 올바르게 사용 했습니까?) 다음을 살펴보십시오.
float와 double의 주요 차이점은 정밀도입니다. Wikipedia에는 Single precision (float) 및 Double precision 에 대한 자세한 정보가 있습니다 .
double은 정밀도가 더 높은 반면 float는 메모리를 덜 차지하고 더 빠릅니다. 일반적으로 충분히 정확하지 않은 경우가 아니라면 float를 사용해야합니다.