코드가 있는데 이해가 안됩니다. 나는 정밀도가 매우 중요한 어플리케이션을 개발 중입니다. 하지만 .NET에서는 그다지 중요하지 않습니다. 이유가 무엇입니까? 나는 모른다.Double Precision
double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());
하지만 메시지 상자가 표시됩니다 : 3.5 이 제발 도와주세요, 감사합니다.
코드가 있는데 이해가 안됩니다. 나는 정밀도가 매우 중요한 어플리케이션을 개발 중입니다. 하지만 .NET에서는 그다지 중요하지 않습니다. 이유가 무엇입니까? 나는 모른다.Double Precision
double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());
하지만 메시지 상자가 표시됩니다 : 3.5 이 제발 도와주세요, 감사합니다.
정밀도를 가질 수 있지만 수행 할 작업에 따라 다릅니다. 당신이 콘솔 응용 프로그램에서 다음 넣으면 :
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도 참조하십시오.
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());
하지만이 번호로 무엇을해야합니까? –
Decimal은 해당 정밀도를 갖지만 계산을 double로 수행 한 다음 각 값을 더하기 전에 Decimal로 변환해야합니다. 위의 편집을 참조하십시오. – Guffa
더블 정밀도가 15 ~ 16 자리 숫자를 개최 할 수 있음을 의미합니다. 3.5 + 1e-20 = 21 자리. 그것은 이중 정밀도로 표현 될 수 없다. 십진수와 같은 다른 유형을 사용할 수 있습니다.
그러나 부동 소수점 이후에 몇 개의 숫자를 가질 수 있습니까? –
총 15-16 자리 부동 소수점은 숫자의 앞이나 뒤에 또는 사이에있을 수 있습니다. – Kcats
정밀도가 중요한 모든 작업을 수행하려면 부동 소수점의 제한 사항을 알아야합니다. 좋은 참고 자료는 David Goldberg's "What Every Computer Scientist Should Know About Floating-Point Arithmetic"입니다.
부동 소수점이 충분한 정밀도를 제공하지 않으며 10 진수 형식으로 작업해야하는 경우가 있습니다. 그러나 이들은 항상 부동 소수점보다 훨씬 느립니다. 이는 정확도와 속도 사이의 절충점입니다.
좋은 기사이지만 비 수학자가 읽기에는 조금 어렵습니다. 이 코드 원숭이에 대한 다소 쉬운 읽기 : http://floating-point-gui.de/ –
http://stackoverflow.com/questions/566958/double-precision-problems-on-c-net –
정확히 '3.50000000000000000001'과 동일한 'double'값이 없습니다. 그 수에 가장 가까운 두 배는 3.5입니다. –