В какой момент пары начинают терять точность? - PullRequest
1 голос
/ 13 февраля 2012

Моему приложению нужно выполнить некоторые операции:>, <, ==,! =, +, -, ++ и т. Д. (Но без деления) над некоторыми числами.Эти числа иногда целочисленные, и реже плавающие. </p>

Если я использую внутренне «двойной» тип (как определено IEEE 754) даже для целых чисел, вплоть до того момента, когда я могу безопасно использовать их, как если быони были int с, без работы со странными ошибками округления (например, n == 5 && n == 6 оба истинны, потому что они округляют до одинакового числа)?

Очевидно, что второй входразличные операции (+, - и т. д.) всегда являются целыми числами, и я знаю, что с 0,000 [..] 01 у меня будут проблемы с самого начала.

В качестве дополнительного ответа, тот же вопрос, но для float.

Ответы [ 2 ]

8 голосов
/ 14 февраля 2012

Число битов в IEEE-754 двойной мантиссе равно 52, и есть дополнительный подразумеваемый бит, который всегда равен 1. Это означает, что максимальное значение, которое может содержаться точно, равно 2 ^ 53, или 9007199254740992.

Плавающая мантисса составляет 23 бита, опять же с подразумеваемым битом. Максимальное целое число, которое может быть точно представлено, составляет 2 ^ 24 или 16777216.

Если ваше намерение состоит в том, чтобы хранить только целочисленные значения, обычно существует 64-разрядный целочисленный тип, который был бы более подходящим, чем двойной.

Редактировать: изначально у меня было 2 ^ 53-1 и 2 ^ 24-1, но я понял, что нет необходимости вычитать 1 - четное число может использовать преимущество подразумеваемого 0 бита справа от мантиссы.

0 голосов
/ 13 февраля 2012

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

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

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

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

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

...