programing

double 또는 float를 사용해야합니까?

nasanasas 2020. 10. 9. 11:17
반응형

double 또는 float를 사용해야합니까?


C ++에서 다른 하나를 사용하는 것의 장점과 단점은 무엇입니까?


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

요컨대, 표현 double더 높은 정밀도허용 하지만 특정 계산의 경우 더 큰 오류가 발생합니다 . "올바른"선택이 될 것입니다 : 많은 정밀도로 사용하기는하지만 더 필요로 하고 올바른 알고리즘을 선택합니다 .

어쨌든 많은 컴파일러는 "비 엄격"모드에서 확장 부동 소수점 연산을 수행합니다 (즉, 하드웨어에서 사용할 수있는 더 넓은 부동 소수점 유형 (예 : 80 비트 및 128 비트 부동) 사용), 이것도 고려해야합니다. 실제로 속도의 차이를 거의 볼없습니다 . 어쨌든 하드웨어의 기본입니다.


특별한 이유가 없다면 double을 사용하십시오.

놀랍게도 C (및 C ++)의 "일반"부동 소수점 유형은 double이며 float가 아닙니다. sinlog 와 같은 표준 수학 함수 는 인수로 double을 취하고 double을 반환합니다. 프로그램에서 3.14 를 작성할 때와 같은 일반 부동 소수점 리터럴 은 double 유형을 갖습니다. 플로트가 아닙니다.

일반적인 현대 컴퓨터에서 double은 float만큼 빠르거나 더 빠를 수 있으므로 대규모 계산의 경우에도 성능은 일반적으로 고려할 요소가 아닙니다. (그리고 그것들은 계산이되어야합니다. 그렇지 않으면 성능이 마음에 들지 않아야합니다. 나의 새로운 i7 데스크탑 컴퓨터는 1 초에 60 억의 두 배를 할 수 있습니다.)


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

  1. float, double 및 long double의 컴파일러 구현. C ++ 표준은 다음과 같이 설명합니다.

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

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

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

  3. FPU 아키텍처. IA32의 FPU는 내부적으로 80 비트입니다. 32 비트 및 64 비트 부동 소수점은로드시 80 비트로 확장되고 저장시 축소됩니다. 4 개의 32 비트 플로트 또는 2 개의 64 비트 플로트를 병렬로 수행 할 수있는 SIMD도 있습니다. SIMD 사용은 표준에 정의되어 있지 않으므로 SIMD를 사용할 수 있는지 확인하기 위해 더 복잡한 분석을 수행하거나 특수 함수 (라이브러리 또는 내장 함수)를 사용해야하는 컴파일러가 필요합니다. 80 비트 내부 형식의 결론은 데이터가 RAM에 저장되는 빈도에 따라 약간 다른 결과를 얻을 수 있다는 것입니다 (따라서 정밀도가 떨어짐). 이러한 이유로 컴파일러는 부동 소수점 코드를 특히 잘 최적화하지 않습니다.

  4. 메모리 대역폭. double이 float보다 더 많은 저장 공간을 필요로하는 경우 데이터를 읽는 데 더 오래 걸립니다. 순진한 대답입니다. 최신 IA32에서는 모든 데이터가 어디에서 오는지에 따라 다릅니다. L1 캐시에있는 경우 데이터가 단일 캐시 라인에서 제공되는 경우로드는 무시할 수 있습니다. 둘 이상의 캐시 라인에 걸쳐 있으면 약간의 오버 헤드가 있습니다. L2의 경우 시간이 오래 걸리고 RAM에 있으면 더 오래 걸리고 마지막으로 디스크에 있으면 엄청난 시간이 걸립니다. 따라서 float 또는 double의 선택은 데이터가 사용되는 방식보다 덜 중요합니다. 많은 순차 데이터에 대해 작은 계산을 수행하려는 경우 작은 데이터 유형이 바람직합니다. 작은 데이터 세트에 대해 많은 계산을 수행하면 더 큰 데이터 유형을 사용하여 큰 효과를 얻을 수 있습니다. 만약 너라면' 데이터에 매우 무작위로 다시 액세스하면 데이터 크기 선택이 중요하지 않습니다. 데이터는 페이지 / 캐시 라인에로드됩니다. 따라서 RAM에서 1 바이트 만 원하는 경우에도 32 바이트를 전송할 수 있습니다 (시스템 아키텍처에 따라 매우 다름). 무엇보다 CPU / FPU는 수퍼 스칼라 (일명 파이프 라인) 일 수 있습니다. 따라서로드에 여러주기가 걸릴 수 있지만 CPU / FPU는로드 시간을 어느 정도 숨기는 다른 작업 (예 : 곱하기)을 수행 하느라 바쁠 수 있습니다.

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

사양이있는 경우 최적의 선택을 안내합니다. 그렇지 않으면 무엇을 사용할지 경험해야합니다.


Double이 더 정확하지만 8 바이트로 코딩됩니다. float는 4 바이트에 불과하므로 공간과 정밀도가 떨어집니다.

응용 프로그램에 double 및 float가있는 경우 매우주의해야합니다. 나는 과거에 그것 때문에 버그가 있었다. 코드의 한 부분은 float를 사용하고 나머지 코드는 double을 사용했습니다. double을 float로 복사 한 다음 float를 double로 복사하면 큰 영향을 줄 수있는 정밀도 오류가 발생할 수 있습니다. 제 경우에는 화학 공장 이었어요 ... 바라건대 극적인 결과가 없었 으면합니다 :)

아리안 6 로켓이 몇 년 전에 폭발 한 것은 이런 종류의 버그 때문이라고 생각합니다 !!!

변수에 사용할 유형을 신중하게 생각하십시오.


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


이것은 컴파일러가 double을 구현하는 방법에 따라 다릅니다. double과 float가 같은 유형이되는 것은 합법적입니다 (일부 시스템에 있음).

즉, 실제로 다른 경우 주요 문제는 정밀도입니다. double은 크기 차이로 인해 훨씬 ​​더 높은 정밀도를 갖습니다. 사용하는 숫자가 일반적으로 부동 소수점 값을 초과하면 double을 사용하십시오.

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


적절한 결과를 얻기 위해 필요한 정밀도를 사용하십시오 . 그런 다음 코드가 원하는대로 수행되지 않는 경우 (프로파일 링을 올바르게 사용 했습니까?) 다음을 살펴보십시오.


나는 차이점에 관계없이 (모든 사람들이 지적했듯이 수레가 더 적은 공간을 차지하고 일반적으로 더 빠릅니다) ... 누군가 double을 사용하여 성능 문제를 겪은 적이 있습니까? 나는 double을 사용한다고 말하고 나중에 "와우, 이것은 정말 느리다"라고 결정하면 ... 성능 병목 현상을 찾으십시오 (아마도 double을 사용한 사실이 아닙니다). 그런 다음 여전히 너무 느리다면 정밀도를 희생하고 float를 사용할 수있는 위치를 확인하십시오.


The main difference between float and double is precision. Wikipedia has more info about Single precision (float) and Double precision.


It depends highly on the CPU the most obvious trade-offs are between precision and memory. With GBs of RAM, memory is not much of an issue, so it's generally better to use doubles.

As for performance, it depends highly on the CPU. floats will usually get better performance than doubles on a 32 bit machine. On 64 bit, doubles are sometimes faster, since it is (usually) the native size. Still, what will matter much more than your choice of data types is whether or not you can take advantage of SIMD instructions on your processor.


double has higher precision, whereas floats take up less memory and are faster. In general you should use float unless you have a case where it isn't accurate enough.

참고URL : https://stackoverflow.com/questions/1074474/should-i-use-double-or-float

반응형