Двойная точность - PullRequest
0 голосов
/ 17 мая 2009

У меня есть код, и я его не понимаю. Я разрабатываю приложение, точность которого очень важна. но это не важно для .NET, почему? Я не знаю.

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

но в окне сообщения отображается: 3.5 Пожалуйста, помогите мне, спасибо.

Ответы [ 5 ]

2 голосов
/ 17 мая 2009

Если вы делаете что-то, где точность очень важна, вы должны знать об ограничениях с плавающей запятой. Хорошая ссылка - Дэвида Голдберга «Что должен знать каждый учёный-компьютерщик об арифметике с плавающей точкой» .

Вы можете обнаружить, что с плавающей запятой недостаточно точна, и вам нужно работать с десятичным типом. Однако они всегда намного медленнее, чем числа с плавающей запятой - это компромисс между точностью и скоростью.

2 голосов
/ 17 мая 2009

Точность Double составляет 15 цифр (17 цифр внутри). Значение, которое вы вычисляете с помощью Math.Pow, является правильным, но когда вы добавляете его к value, оно слишком мало, чтобы иметь значение.

Edit:
Десятичное число может обрабатывать эту точность, но не вычисление. Если вам нужна такая точность, вам нужно выполнить вычисления, а затем преобразовать каждое значение в Decimal, прежде чем сложить их вместе:

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

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

MessageBox.Show(result.ToString());
1 голос
/ 17 мая 2009

Вы можете иметь точность, но это зависит от того, что еще вы хотите сделать. Если вы добавили в консольное приложение следующее:

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, как и почти все в классе Math, принимает только двойные значения:

double Pow(double x, double y);

Таким образом, вы не можете взять синус десятичной дроби (кроме как путем преобразования его в двойную)

Также см. этот вопрос .

1 голос
/ 17 мая 2009

Или используйте тип Десятичный вместо двойного.

0 голосов
/ 17 мая 2009

Двойная точность означает, что он может содержать 15-16 цифр. 3,5 + 1е-20 = 21 цифра. Он не может быть представлен в двойном порядке. Вы можете использовать другой тип, например десятичный.

...