2009-05-16 2 views
0

코드가 있는데 이해가 안됩니다. 나는 정밀도가 매우 중요한 어플리케이션을 개발 중입니다. 하지만 .NET에서는 그다지 중요하지 않습니다. 이유가 무엇입니까? 나는 모른다.Double Precision

double value = 3.5; 
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString()); 

하지만 메시지 상자가 표시됩니다 : 3.5 이 제발 도와주세요, 감사합니다.

+0

http://stackoverflow.com/questions/566958/double-precision-problems-on-c-net –

+0

정확히 '3.50000000000000000001'과 동일한 'double'값이 없습니다. 그 수에 가장 가까운 두 배는 3.5입니다. –

답변

1

정밀도를 가질 수 있지만 수행 할 작업에 따라 다릅니다. 당신이 콘솔 응용 프로그램에서 다음 넣으면 :

double a = 1e-20; 
Console.WriteLine(" a = {0}", a); 
Console.WriteLine("1+a = {0}", 1+a); 

decimal b = 1e-20M; 
Console.WriteLine(" b = {0}", b); 
Console.WriteLine("1+b = {0}", 1+b); 

당신은

a = 1E-20 
1+a = 1 
b = 0,00000000000000000001 
1+b = 1,00000000000000000001 

를 얻을 그러나 수학 클래스의 거의 모든처럼 Pow 기능은, 만 배가 소요 참고한다 :

double Pow(double x, double y); 

그래서 십진수의 사인을 취할 수 없습니다 (그 외의 경우 double로 변환 함)

this question도 참조하십시오.

1

두 배가 아닌 Decimal 유형을 사용하십시오.

+0

그러나 소수점에 Math.Pow()를 사용할 수 없습니다. –

+1

10^-20은 쉽게 상수로 주어질 수 있습니다. Math.Pow()를 호출 할 필요가 없습니다. – Joey

+0

네가 맞다.하지만 나는 내 문제를 보여 주기만을 원했다. –

2

Double의 정밀도는 15 자리 (내부 17 자리)입니다. Math.Pow으로 계산 한 값은 정확하지만 value에 값을 추가하면 너무 작아 차이를 만들 수 없습니다.

편집 :
소수점은 정밀도는 처리 할 수 ​​있지만 계산할 수는 없습니다. 당신이 그 정밀도를 원한다면, 당신은 그들을 함께 추가하기 전에 Decimal 각 값을 다음 계산을 변환해야합니다

double value = 3.5; 
double small = Math.Pow(10, -20); 

Decimal result = (Decimal)value + (Decimal)small; 

MessageBox.Show(result.ToString()); 
+0

하지만이 번호로 무엇을해야합니까? –

+0

Decimal은 해당 정밀도를 갖지만 계산을 double로 수행 한 다음 각 값을 더하기 전에 Decimal로 변환해야합니다. 위의 편집을 참조하십시오. – Guffa

0

더블 정밀도가 15 ~ 16 자리 숫자를 개최 할 수 있음을 의미합니다. 3.5 + 1e-20 = 21 자리. 그것은 이중 정밀도로 표현 될 수 없다. 십진수와 같은 다른 유형을 사용할 수 있습니다.

+0

그러나 부동 소수점 이후에 몇 개의 숫자를 가질 수 있습니까? –

+0

총 15-16 자리 부동 소수점은 숫자의 앞이나 뒤에 또는 사이에있을 수 있습니다. – Kcats

2

정밀도가 중요한 모든 작업을 수행하려면 부동 소수점의 제한 사항을 알아야합니다. 좋은 참고 자료는 David Goldberg's "What Every Computer Scientist Should Know About Floating-Point Arithmetic"입니다.

부동 소수점이 충분한 정밀도를 제공하지 않으며 10 진수 형식으로 작업해야하는 경우가 있습니다. 그러나 이들은 항상 부동 소수점보다 훨씬 느립니다. 이는 정확도와 속도 사이의 절충점입니다.

+0

좋은 기사이지만 비 수학자가 읽기에는 조금 어렵습니다. 이 코드 원숭이에 대한 다소 쉬운 읽기 : http://floating-point-gui.de/ –