Как обрабатывать двойные числа, которые превышают double.Max в C #? - PullRequest
0 голосов
/ 27 августа 2018

Я работаю с методом, который возвращает значение large double (> 1e308), а затем это значение умножается на small double значение, чтобы получить разумное число . Моя проблема в том, как обработать значения double в C # , которые превышают (1.79E308), не получая вывод Infinity?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Есть два пути. 1. вы можете переключиться на другой тип, который обрабатывает такие большие числа. Но в будущем вы сможете найти еще один пример, где решение с плавающей запятой снова нарушает ваши вычисления. 2. Правильный путь. Вы должны изменить дизайн (рефакторинг) процесса расчета вашего приложения. Постарайтесь выяснить, какая часть вашего кода работает с большими числами, а какая - с маленькими. Работайте с ним отдельно и объединяйте результаты до финиша.

0 голосов
/ 28 августа 2018

Сначала умножьте с небольшим числом. Тогда с большим номером

double x = ...; // The number to be multiplied.
double result = x * smallNumber * largeNumber;
0 голосов
/ 28 августа 2018

Попробуйте использовать логарифмы (Log(1e308) == 709.196...): вместо

 double bigNumber = SomeMethod();          // double.PositiveInfinity
 double smallNumber = SomeOtherMethod();
 double result = bigNumber * smallNumber;  // double.PositiveInfinity

Реализовать

 double bigNumber = SomeMethodLog();                  // reasonable value
 double smallNumber = SomeOtherMethodLog();
 // bigNumber will be cancelled out with smallNumber
 double result = Math.Exp(bigNumber + smallNumber);   // reasonable value
...