Может ли C # хранить более точные данные, чем двойные? - PullRequest
9 голосов
/ 29 марта 2011

double в C # недостаточно точны для моих нужд. Я пишу фрактальную программу, и после увеличения в несколько раз я теряю точность.

Имеется ли тип данных, который может содержать более точную информацию с плавающей запятой (т. Е. Больше десятичных разрядов), чем двойной?

Ответы [ 3 ]

17 голосов
/ 29 марта 2011

Да, decimal предназначен именно для этого.

Однако учтите, что диапазон десятичного типа меньше двойного. Это значение double может содержать большее значение, но оно теряет точность. Или, как указано в MSDN:

Десятичное ключевое слово обозначает 128-бит тип данных. По сравнению с плавающей точкой типы, десятичный тип имеет больший точность и меньший диапазон, который делает его пригодным для финансовых и денежные расчеты. Приблизительный диапазон и точность для десятичного числа тип показан в следующей таблице.

Основное различие между decimal и double состоит в том, что decimal является фиксированной точкой, а double является плавающей точкой . Это означает, что десятичное число хранит точное значение, тогда как double представляет значение, представленное дробью, и является менее точным. decimal составляет 128 бит, поэтому для его хранения требуется двойной пробел. Расчеты на decimal также медленнее (мера!).

Если вам нужна еще большая точность, тогда из .NET 4 можно использовать BigInteger (вам нужно будет обрабатывать десятичные точки самостоятельно). Здесь вы должны знать, что BigInteger является неизменяемым, поэтому любая арифметическая операция над ним создаст новый экземпляр - если числа большие, это может ухудшить производительность.

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

4 голосов
/ 29 марта 2011

.NET Framework 4 представляет структуру System.Numerics.BigInteger, которая может содержать числа с произвольно большой точностью.

0 голосов
/ 29 марта 2011

Проверьте BigInteger (.NET 4), если вам нужна еще большая точность, чем дает Decimal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...