System.math 및 예를 들어 MathNet.numerics가 두 배를 기준으로하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1680907

  •  16-09-2019
  •  | 
  •  

문제

모든 방법 System.math 테이크 double 매개 변수 및 리턴 매개 변수로 상수도 유형입니다 double. 나는 체크 아웃했다 Mathnet.numerics, 그리고 똑같은 경우가 있습니다.

왜 이런거야? 특히 상수의 경우. 그렇지 않습니다 decimal 더 정확해야합니까? 계산을 할 때 종종 유용하지 않습니까?

도움이 되었습니까?

해결책

이것은 고전적인 속도 대기업으로 거래됩니다.

그러나 예를 들어 PI의 경우 필요한 가장 많은 숫자는 41입니다.

필요한 PI의 가장 많은 숫자는 41입니다. 양성자의 직경보다 적은 오류로 우주의 둘레를 계산하려면 PI †의 41 자리가 필요합니다. 41 자리 숫자가 PI에서 충분한 정확도라고 결론을 내릴 수 있습니다. 따라서 2002 년에 계산 된 PI의 1 조분과 1 조의 숫자에서는 41 번째를 넘어서 모든 숫자는 실용적인 가치가 없습니다.

또한 소수점과 이중은 약간 다른 내부 저장 구조를 갖습니다. 소수점은 이진 데이터를 보유하도록 만들어진 Base 10 데이터를 저장하도록 설계되었습니다. 이진 기계 (존재하는 모든 컴퓨터와 같은)에서 더블은 범위 내에 숫자를 저장할 때 낭비되는 비트가 적습니다.

또한 고려 :

System.Double      8 bytes    Approximately ±5.0e-324 to ±1.7e308 with 15 or 16 significant figures
System.Decimal    12 bytes    Approximately ±1.0e-28 to ±7.9e28 with 28 or 29 significant figures

보시다시피, Decimal은 더 작은 범위이지만 정밀도는 높습니다.

다른 팁

아니요, - 소수민은 더 이상 더 이상 "정확한"것이 아닙니다. "개념"정확성", (컴퓨터의 수치 표현에 대해 말할 때) 잘못된 것입니다. 모든 유형은 절대적으로 100% 정확합니다. 약간 번호. 부호없는 바이트는 0에서 255까지의 정수를 나타내는 100% 정확합니다. 그러나 분수 나 범위 외부의 네거티브 또는 정수에는 좋지 않습니다.

데시 말은 특정 세트를 나타내는 데 100% 정확합니다. 베이스 10 가치. 복식 (가치를 사용하여 가치를 저장하기 때문에 이진 IEEE 지수 표현)은 세트를 나타냅니다. 이진 번호. 일반적으로 다른 것보다 더 정확하지는 않습니다. 그들은 단순히 다른 목적을위한 것입니다.

일부 독자들에게는 충분히 명확하지 않은 것처럼 보이기 때문에 조금 더 자세히 설명하기 위해 ...

소수점으로 표현할 수있는 모든 숫자를 취하고 그 중 하나를 숫자 라인에 표시하면 모든 인접한 쌍은 추가가 있습니다 무한대 실수의 ~ 아니다 소수점으로 대표됩니다. 숫자에 대해 정확히 동일한 진술을 할 수있는 숫자는 이중으로 표시 될 수 있습니다. 정수를 제외하고는 숫자 선에서 모든 소수점을 파란색으로 표시하고 빨간색으로 적색으로 표시되면 동일한 값이 두 색상으로 표시된 곳은 거의 없습니다. 일반적으로, 마크의 99.9999 %에 대해 (내 비율을 nitpick하지 마십시오) 파란색 세트 (Decimals)는 빨간색 세트 (복식)와 완전히 다른 숫자 세트입니다.

파란색 세트에 대한 우리의 정의에 의해 그것은베이스 10 만티사/지수 표현이며, 더블은베이스 2 Mantissa/지수 표현이기 때문입니다. 기본 2 Mantissa 및 지수로 표시되는 모든 값, (1.00110101001 x 2 ^ (-11101001101001) 수단은 Mantissa 값을 취합니다 (1.00110101001) 그리고 지수의 힘으로 올라간 2를 곱하십시오 (지수가 음수 일 때 이것은 지수의 절대 값의 전력으로 2로 나누는 것과 다릅니다). 이는 지수가 음수 인 경우 (또는 만티사의 일부가 분수 이진 인 경우) 숫자는 10 진수의 Mantissa 및 지수로 표시 될 수 없으며 그 반대도 마찬가지입니다.

실수 라인에 무작위로 떨어지는 임의의 실수의 경우, 파란색 소수점 중 하나 또는 빨간색 복식 중 하나에 가깝습니다.

소수점은 더 정확하지만 범위가 적습니다. 일반적으로 물리 및 수학 계산에는 두 배를 사용하지만 재무 및 금전적 계산에는 10 진수를 사용합니다.

자세한 내용은 MSDN의 다음 기사를 참조하십시오.

더블http://msdn.microsoft.com/en-us/library/678hzkk9.aspx

소수http://msdn.microsoft.com/en-us/library/364x0z75.aspx

"내가 원하는 것을하지 않는다"는 대부분의 주장이 "하지만"더 빠릅니다.

특히 정확도를 제어하려면 사용자 제어 가능한 방식으로 정확한 정밀도를 구현하는 데 시간이 걸린 다른 언어가 있습니다.

http://www.doughellmann.com/pymotw/decimal/

정밀도가 당신에게 정말로 중요하다면, 당신은 아마도 수학자들이 사용할 언어를 사용하는 것이 더 나을 것입니다. Fortran을 좋아하지 않는다면 Python은 현대적인 대안입니다.

당신이 일하는 언어가 무엇이든, 황금 규칙을 기억하십시오 : 믹싱 유형을 피하십시오 ... 운영자 b를 시도하기 전에 A와 B를 동일하게 변환하십시오. b.

내가 추측 할 위험이 있다면, 그 기능이 내부적으로 소수성을 사용하지 않는 저수준 수학 기능 (아마도 C)을 활용한다고 말하면, 소수점을 반환하려면 어쨌든 두 배에서 10 진수로 캐스트가 필요합니다. 게다가, 소수점 값 유형의 목적은 정확성을 보장하는 것입니다. 이러한 기능은 그렇지 않습니다 할 수 없습니다 무한한 정밀도없이 100% 정확한 결과를 반환합니다 (예 : 비합리적 숫자).

정확한 것을 요구하는 경우 소수점이나 부유물이나 두 배가 충분하지 않습니다. 또한, 소수점은 너무 비싸고 과도하게 사용되어 정기적으로 농담이되고 있습니다.

분수에서 일하고 궁극적 인 정밀도가 필요한 경우 분수를 사용하십시오. 그것은 같은 오래된 규칙입니다. 필요한 경우에만 한 번만 변환합니다. 반올림 규칙도 앱, 도메인 등에 따라 다르지만 확실히 적합한 곳에서 이상한 예제를 찾을 수 있습니다. 그러나 다시, 당신이 분수와 궁극적 인 정밀도를 원한다면, 대답은 분수 외에는 아무것도 사용하지 않는 것입니다. 임의의 정밀도의 특징을 원할 수도 있습니다.

일반적으로 CLR의 실제 문제는 일반적인 원시 디자인과 플랫폼에서 가장 인기있는 컴파일러의 단점으로 인해 일반적인 방식으로 숫자를 다루는 라이브러리를 구현하는 것이 너무 이상하고 평범하다는 것입니다. Java Fiasco와 거의 동일합니다.

Double은 대부분의 도메인을 다루는 최고의 타협으로 밝혀졌으며, MS JIT가 여전히 15 세의 CPU 기술을 활용할 수 없다는 사실에도 불구하고 잘 작동합니다.

MSDN 속도 컴파일러 사용자에게 조각

더블은 내장 유형입니다. IS는 FPU/SSE CORE (이전의 "Math Coprocessor")에 의해 지원되기 때문에 그것이 매우 빠릅니다. 특히 곱셈 및 과학적 기능에서.

10 진수는 실제로 여러 정수로 구성된 복잡한 구조입니다.

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