문제

이중 데이터 유형 대신 단일 데이터 유형을 사용하는 것이 더 적합한 상황이 있습니까?내 검색에 따르면 double의 단점은 더 많은 공간이 필요하다는 것인데 이는 대부분의 응용 프로그램에서는 문제가 되지 않습니다.이 경우 모든 부동 소수점 숫자는 double이어야 합니까?

약간의 배경 정보:저는 좌표와 화학 물질에 관한 많은 데이터를 처리하는 응용 프로그램을 사용하고 있습니다.일부 고객은 데이터 스프레드시트를 가져올 때 정밀도가 높은 일부 값이 단일 정밀도로 반올림된다는 사실을 발견했습니다.

도움이 되었습니까?

해결책

대부분의 데스크탑 응용 프로그램에서 예.

비록 당신이 많은 배열을 가지고 있다면, 그 크기를 줄이는 것은 정밀도가 필요하지 않으면 가치가있을 정도로 중요 할 수 있습니다.

특히 거의 모든 소비자 데스크탑에는 하드웨어에서 이중 정제 부동 소수점 산술이 있습니다.

다른 팁

에서 이것 .NET 기사

데이터 유형 너비

가장 효율적인 데이터 유형은 런타임 플랫폼의 기본 데이터 폭을 사용하는 데이터 유형입니다. 현재 플랫폼에서 데이터 너비는 컴퓨터와 운영 체제 모두에 대해 32 비트입니다.

결과적으로 정수는 현재 Visual Basic .NET에서 가장 효율적인 데이터 유형입니다. 다음은 효율성의 순서대로 길고 짧고 바이트입니다. 예를 들어 removeIntegerChecks 속성을 설정하여 정수 오버 플로우 점검을 끄면 Short 및 Byte의 성능을 향상시킬 수 있지만, 이는 감지되지 않은 오버플로로 인해 잘못된 계산의 위험이 발생합니다. 런타임 중에이 체크를 켜거나 끄는 것을 전환 할 수 없습니다. 다음 응용 프로그램 빌드에 대해서만 값을 설정할 수 있습니다.

분수 값이 필요한 경우 현재 플랫폼의 부동 소수점 프로세서는 모든 작업을 이중 정밀도로 수행하기 때문에 최상의 선택은 두 배입니다. 다음은 효율성의 순서대로 단일 및 소수점입니다.

Mark가 그의 의견에서 말했듯이, 공간은 메모리 제한 시스템에서 문제가 될 수 있습니다. 목록을 색인하거나 정렬 할 수도 있고, 싱글에 가치를 저장할 수 있는지 더 두 배로하는 이유는 무엇입니까?

일부 하드웨어에서는 이중 값을 포함하는 산술이 단일 값을 포함하는 것보다 더 오래 걸릴 수 있지만, 대부분의 최신 FPU에는 단일 기본 데이터 유형(예: x86의 80비트 확장 부동 소수점 값)이 있으며 이는 무엇과 관계없이 내부적으로 계산에 사용됩니다. 사용 중인 메모리 내 데이터 유형입니다.즉, "단정도로 FPU 계산이 더 빨라진다"는 것은 일반적으로 ~ 아니다 오늘날 대부분의 최신 하드웨어에서 단정밀도를 사용하는 이유입니다.

즉, 다른 답변에서 자세히 설명된 "메모리를 덜 사용합니다"라는 이유 외에도 SSE 및 AltiVec과 같은 SIMD 벡터 명령어와 관련하여 매우 실용적인 이유가 있습니다. 단정밀도는 이중 정밀도보다 두 배 빠를 가능성이 높습니다. , 명령어는 고정된 크기의 벡터에서 작동하므로 단일 벡터에 두 배의 단정밀도 값을 넣을 수 있으며 처리 시간은 일반적으로 동일하게 유지됩니다.

예를 들어, 2개의 클록 사이클에서 벡터 곱셈을 처리할 수 있는 128비트 벡터 장치를 사용하면 클록당 2개의 단정밀도 곱셈과 1개의 이중 정밀도 곱셈의 처리량을 얻을 수 있습니다. .

비슷한 효과가 메모리 대역폭에서도 발생하며 벡터 처리에만 국한되지 않습니다. 큰 double 배열이 있는 경우 두 배의 공간을 차지할 뿐만 아니라 알고리즘이 다음과 같은 경우 처리하는 데 최대 두 배의 시간이 걸릴 수 있습니다. 대역폭이 제한됩니다(벡터 처리 장치의 크기가 증가하고 대기 시간이 감소함에 따라 이러한 현상은 점점 더 발생할 가능성이 높습니다).

복식은 더 많은 공간을 차지하지만 추가 정밀도가 필요할 수도 있고 필요하지 않을 수도 있습니다.나는 부동 소수점 산술이 매우 일반적인 과학계에서 많은 프로그래밍을 해왔고 종종 이중 또는 더 높은 정밀도로 계산을 수행할 수 있지만 결과를 악영향 없이 단일로 저장할 수 있다는 것을 발견했습니다.

숫자가 FPU에 흡수되면 어쨌든 매우 높은 정밀도로 확장된다는 점을 명심하십시오.즉, 두 가지 정밀도 모두에서 무엇을 하든 시도해 보고 결과가 비슷한지 확인하는 것이 가장 좋습니다.

불행하게도 컴퓨팅은 여전히 ​​실험적인 과학입니다.

OpenGL을 코딩하는 경우 Gldouble 대신 Glsingle (예 : 단일)을 사용하는 것이 일반적입니다. 거의 모든 상황에서 단일 정밀도는 대부분의 그래픽 애플리케이션에 충분하고 빠를 수 있어야합니다. 고백하지만 최신 GPU에 대해서는 확실하지 않다고 고백합니다.

이것에 대해 제가 가장 좋아하는 인용은 단일 정밀도가 달과 뒤로 탐색하기에 충분하다는 것입니다. 실제로 실제 문제를 일으키는 것은 드문 일입니다. 그것은 대부분의 상황에서 스토리지가 저렴하고 소수점에서 이상한 이진에 대한 이진이있을 가능성이 적기 때문에 요즘 두 배에 도달 할 것입니다.

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