2010-08-02 3 views

답변

16

과학적 가치는 자연적으로 부정확 한 정도가있는 "자연적"값 (길이, 질량, 시간 등)이되는 경향이 있습니다. 그러나 매우 크거나 매우 큰 또는 아주 작은 숫자를 원할 수도 있습니다. 이 값들에 대해서는 일반적으로 double이 좋습니다. (하드웨어 지원이 거의 모든 곳에서) 빠르며 크고 작은 값으로 위아래로 크기가 조정되며 정확히 decimal 값과 관련이없는 경우 일반적으로 잘 작동합니다.

decimal은 정확한 값이있는 "인공적"숫자에 적합한 유형이며, 거의 항상 소수로 자연스럽게 표시됩니다.이 표준적인 예는 통화입니다. 그러나 저장 공간 (4 대신 값 당 8 바이트)에서 double의 두 배나 비싸고 지수 범위가 더 좁기 때문에 범위가 작으며 하드웨어 지원 부족으로 인해 속도가 훨씬 느립니다.

저장 용량 문제가있는 경우에만 개인적으로 float을 사용합니다. 소수점 이하 7 자리 만 있으면 얼마나 빨리 부정확도가 올라갈 수 있는지 놀랍습니다.

궁극적으로 "곰들이 당신을 먹을 것"이라는 의견이 제시하는 바와 같이, 그것은 당신이 이야기하고있는 가치에 달려 있습니다. 물론 당신이 그걸로 무엇을 할 계획입니까? 더 이상의 정보가 없으면 나는 double이 좋은 출발점이라고 생각합니다. 그러나 당신은 정말로 개인적인 상황에 따라 결정해야합니다.

+1

"자연"대 "인공"구별을 좋아합니다. –

5

Double은 이러한 작업에 가장 신뢰할 수있는 데이터 형식 인 것처럼 보입니다. WPF에서도 광범위하게 사용합니다.

8

물론 "과학 계산"이라는 용어는 다소 모호하지만 일반적으로 double입니다.

float은 주로 32 비트 부동 소수점 숫자가 필요한 라이브러리와의 호환성을위한 것입니다. floatdouble 연산 (더하기와 같음)의 성능은 완전히 동일하므로 새 코드는 더 높은 정밀도를 가지기 때문에 항상 double을 사용해야합니다.

그러나 x86 JITter는 float을 사용하거나 반환하는 함수를 인라인하지 않으므로 float 메서드를 사용하면 실제로 속도가 느려질 수 있습니다. 다시 말하지만 호환성을위한 것입니다. 인라인 된 경우 실행 엔진은 정밀도를 낮추는 변환 단계를 건너 뜁니다. 따라서 JITter는 이러한 함수를 인라인하는 경우 의도하지 않게 일부 계산 결과를 변경할 수 있습니다.

마지막으로 decimal도 있습니다. 특정 소수 자릿수를 갖는 것이 중요 할 때마다이 값을 사용하십시오. 고정 관념의 유스 케이스는 통화 조작이지만, 물론 소수점 이하 2 자리를 지원합니다. 실제로는 80 비트 데이터입니다.

정확도가 64 비트 double이면 충분하지 않은 경우에는 임의 정밀도 숫자에 외부 라이브러리를 사용하는 것이 좋습니다. 물론 특정 과학적 유스 케이스에서 특별히 호출해야하는 경우에만 필요합니다.

+2

성능에 좋은 점. –

+0

인라인 주장에 대한 출처는 무엇입니까? 3.5 SP1에서 JIT가 값 유형 매개 변수를 사용하는 함수를 인라인 할 수 없도록 수정 된 버그가 있었지만 다른 문제는 생각할 수 없습니다. – JulianR

+0

소스를 더 이상 찾을 수 없지만 문제를 언급했습니다. CLR 평가 스택은 부동 소수점 숫자에 대해서만 64 비트 값을 사용합니다. 32 비트 부동 소수점이 메서드에 전달되거나 메서드가 32 비트 부동 소수점을 반환 할 때마다 평가 스택의 값은 정밀도 부족을 유지하기 위해 32 비트 부동 소수점으로 변환됩니다. – Timwi

2

십진수는 float/double보다 많이 사용된다는 점에 유의하십시오 (Jon Skeet과 Timwi가 쓴 것 이외에).

0

정확한 값이 필요한 경우가 아니면 두 번 권하고 싶습니다. 10 진수는이 정확성이 필요한 재무 계산 용입니다.과학적 계산은 어쨌든 정확하게 1 미터를 측정 할 수 없기 때문에 작은 오차를 허용합니다. 플로트는 스토리지가 문제가되는 경우에만 도움이됩니다 (예 : 거대한 행렬).

관련 문제