문제

몇 년 전에 나는 수레의 정밀 문제에 대한 어려운 방법을 배웠으므로 그것들을 사용하여 그만 두었습니다. 그러나 나는 여전히 floats를 사용하여 코드를 사용하여 계산 중 일부가 부정확하다는 것을 알고 있기 때문에 울부 짖습니다.

그렇다면 플로트를 사용하는 것이 언제 적절합니까?

편집하다:정보로서, 나는 숫자의 정확성이 중요하지 않은 프로그램을 발견했다고 생각하지 않습니다. 그러나 나는들을 듣는 데 관심이있을 것입니다.

도움이 되었습니까?

해결책

짧은 대답 : 당신은 a를 사용하면됩니다 뜨다 당신이 무엇을하고 있는지 정확히 알고 그 이유를 알 때.

긴 답변 : 부유물 (반대로 더블스) 내가 아는 한 3D API 외부에서 더 이상 사용되지 않습니다. 플로트와 복식은 최신 CPU에서 동일한 성능 특성을 가지고 있으며, 복식은 다소 크며 그게 전부입니다. 의심스러운 경우 두 배를 사용하십시오.

오 예, 사용합니다 소수 물론 재무 계산을 위해.

다른 팁

모든 부동 소수점 계산은 일반적으로 부정확 한 경우, 복식보다 더 뜬다. 더 많은 정보를 원한다면 읽으십시오모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것

플로트를 사용하는시기 - 정밀도가 메모리 저장보다 덜 중요 할 때 종종 사용됩니다. 예를 들어 비디오 게임의 간단한 입자 시뮬레이션.

먼저, 십진 값을 정확하게 나타내려면 플로트 나 복식을 사용하지 마십시오 - 정수 유형 (int, long etc) 또는 소수점 (스케일링 계수가있는 정수 유형)을 사용하십시오. 플로트와 복식은 기본 2의 지수 표현으로 내부적으로 변환되며 기본 10의 지수 표현으로 정확하게 표현되는 숫자는 일반적으로 정확하게 표현 될 수 없습니다. (예 : 숫자 10은 부유물이나 복식으로 만 표시됩니다).

둘째, 정밀도 측면에서 필요한 것에 따라 다릅니다. 나는 정밀도가 중요하지 않은 계산이 없다는 당신의 감정에 동의하지 않습니다. 일반적으로 최종 결과가 정확한 3 자리의 특정 요구 사항이 있습니다. 입력에 정확도가 제한적인 경우 가능한 최고 정밀도를 찾는 것은 의미가 없습니다. 밀가루의 5g 무게가 약 5g의 무게와 스케일은 0.5g에 대한 정확도 만 있다고 가정 해 봅시다. 즉, 중간 계산은 일반적으로 더 높은 정밀도의 혜택이지만, 종종 속도가 빠른 경우 높은 정밀보다 중요한 것입니다.

셋째, 루프 내에서 일련의 계산을 미리 성형 할 때, 당신은 부당한 계산을 다룰 때 당신이하고있는 일을 알아야합니다. - 당신은 라운드 오프 오류가 발생하면 일부 알고리즘은 어느 정도의 정밀도에 대한 답변에 도달하지 않을 수 있습니다. . 이러한 문제를 자세히 이해하려면 수치 분석 과정이 필요할 수 있습니다. 이는 계산을 위해 부유물 또는 복식을 선택하는지 여부에 따라 다릅니다.

플로팅 포인트 계산의 경우 보통 플로트보다 더 일반적이고 빠르기 때문에 보통 복식으로 갈 것입니다. 그러나 플로트는 더 작으며 많은 것을 저장 해야하는 경우 캐시 미스로 인해 성능 문제를 방지하기위한 선택입니다.

내가 아는 한, 플로팅 포인트 처리는 더블에 대한 하드웨어로 지원되지만 플로트는 그렇지 않으므로 플로트를 사용하면 이중으로 변환됩니다. 그러나 플로트를 통과 할 때 값을 반복적으로 계산할 때 일부 루틴은 더 빨리 중단됩니다. 이는 더블의 경우 약 8 자리 정밀도 대 약 16만을 원한다는 것을 의미하기 때문입니다.

사용하고 싶은 경우가 많이 있습니다. float. 그러나 내가 이해하지 못하는 것은 대신 사용할 수있는 것입니다. 당신이 사용한다면 double 대신에 float, 그렇습니다. 대부분의 경우, 당신은 그렇게하고 싶습니다. 하지만, double 또한 정밀 문제가 있습니다. 당신은 사용해야합니다 decimal 정확도가 중요 할 때마다.

float 그리고 double 많은 응용 프로그램에서 매우 유용합니다. decimal 비싼 데이터 유형이며 그 범위 (가장 큰 수의 크기)는 double. 컴퓨터는 일반적으로 해당 데이터 유형에 대한 특별한 하드웨어 레벨 지원이 있습니다. 그들은 사용됩니다 많이 과학 컴퓨팅에서. 기본적으로 사용하려는 주요 분수 데이터 유형입니다. 그러나 정밀도가 매우 중요한 금전적 계산에서 decimal 갈 길입니다.

내가 생각할 수있는 가장 일반적인 이유는 공간을 절약하는 것입니다. 이것은 종종 걱정할 가치가 없지만 어떤 경우에는 중요합니다. 플로트는 두 배의 메모리의 절반을 차지하므로 같은 공간에서 두 배나 많은 것을 얻을 수 있습니다. 예를 들어, 나는 더블에 너무 큰 숫자를 가지고 있었지만 배열이 떠 다니면서 램에 맞게 너무 큰 숫자를 가지고있었습니다.

실제로 32 비트의 "단일 정밀도"인 플로트를 사용하는 것이 여전히 일반적인 것이 있습니다 : 그래픽 응용 프로그램 및 인쇄.

다른 이유는 GPU가있는 그래픽 카드입니다. 데이터 유형이 작을수록 비트가 적기 때문에 조작이 더 빠릅니다. 정수 데이터 유형은 높은 다이나믹 레인지 이미지에 문제가 있습니다. 4000 레벨. 따라서 정수 데이터 유형은 레벨의 수를 저장할 수 있지만 배경 밝기를 저장할 수는 없지만 플로트는 문제가 없습니다. 실제로 IEEE 754R은 16 비트와 10 비트 Mantissa의 새로운 "Half Precision"플로트를 허용하여 정밀도를 잃지 만 더 빠른 속도를 허용합니다. OpenGL 및 DirectX 예를 들어, 플로트를 광범위하게 사용합니다. 눈은 유물을 매우 용서하고 있으므로 문제가 없습니다.

그래픽에 대한 다른 모든 미디어 빌딩은 수정 사항으로 부유물을 상속하는 것입니다. Mantissa는 24 비트를 통해 2^24 = 16,700 만 회의 연속 단계를 허용합니다. 2000 DPI 해상도가있는 프린터가있는 경우에도 여전히 213x213 m 시트를 인쇄 할 수 있습니다. 충분한 정밀도 이상.

플로트를 사용하십시오 성능과 크기. 정밀 손실을 관리 할 수있는 경우.

최신 프로세서가 단일 및 이중 정밀 작업을 처리하는 데 같은 시간이 걸리는 것은 사실이지만 때로는 얻을 수 있습니다. 두 배 simd (x86에서 mmx/sse/etc.) 지침으로 플로트를 사용하는 경우 처리량.

SSE 레지스터는 폭이 128 비트이며 유지할 수 있습니다. 4 개의 부유물 또는 2 복식. 따라서 올바르게 사용하면 복식에 비해 플로트로 두 배나 많은 작업을 수행 할 수 있습니다.

매우 큰 데이터 세트를 처리 할 때 크기 감소 (8 대신 4 바이트)가 중요해집니다 (캐싱 등으로 인해 크기 감소는 일반적으로 성능을 향상시킵니다).

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