Когда целесообразно использовать типы данных с плавающей точностью? - PullRequest
5 голосов
/ 07 апреля 2009

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

Тем не менее, каковы случаи использования, когда это приемлемо? И какие общие принципы следует учитывать при принятии решения?

Ответы [ 7 ]

3 голосов
/ 07 апреля 2009

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

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

  1. Научное моделирование
    Научные приложения требуют значительного сокращения чисел и часто используют сложные численные методы для решения систем дифференциальных уравнений. Вы обычно говорите здесь с плавающей точкой двойной точности.

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

  3. Статистика
    Как и в научных приложениях, статистическим методам нужно много с плавающей точкой. Многие численные методы одинаковы; домен приложения просто другой. Вы найдете много статистики и симуляций Монте-Карло в финансовых приложениях и в любой области, где вы анализируете много данных опроса.

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

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

3 голосов
/ 07 апреля 2009

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

Для получения более подробной информации об этом вам действительно нужно прочитать книгу по численному анализу.

2 голосов
/ 07 апреля 2009

Коротко говоря, если вам нужны точные вычисления, НЕ ИСПОЛЬЗУЙТЕ с плавающей запятой.

Не используйте числа с плавающей запятой в качестве индексов цикла: не зацикливайтесь на выполнении:

for ( d = 0.1; d < 1.0; d+=0.1) 
{  /* Some Code... */ }

Вы будете удивлены.

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

2 голосов
/ 07 апреля 2009

Большинство реальных величин неточны, и обычно мы знаем их числовые свойства с гораздо меньшей точностью, чем типичное значение с плавающей запятой. Почти во всех случаях типы C float и double достаточно хороши.

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

Обычным исключением являются деньги, которые рассчитываются точно в соответствии с определенными соглашениями, которые плохо переводятся в двоичные представления. Частично это используемые константы: вы никогда не увидите процентную ставку в пи% или процентную ставку 22/7%, но вы вполне можете увидеть процентную ставку 3,14%. Другими словами, используемые числа обычно выражаются в точных десятичных дробях, не все из которых являются точными двоичными дробями. Кроме того, округление в вычислениях регулируется соглашениями, которые также плохо переводятся в двоичные. Это крайне затрудняет точное дублирование финансовых расчетов со стандартной плавающей точкой, и поэтому люди используют для них другие методы.

1 голос
/ 07 апреля 2009

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

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

Один недостаток состоит в том, что числа с плавающей запятой имеют некоторые удивительные свойства, например, x == x может быть False (если x равно nan), они не следуют большинству математических правил (дистрибутивность, то есть x (y + z)! = x y + x z). В зависимости от значений z, y и z это может иметь значение.

1 голос
/ 07 апреля 2009

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

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

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

Для вычислений, связанных с чем-либо подобным, подходят числа с плавающей запятой.

Кроме того, если вы имеете дело с иррациональными числами, типы с плавающей запятой являются подходящими (и на самом деле ваш единственный выбор), например, линейная алгебра, где вы имеете дело с квадратными корнями.

Деньги разные, потому что обычно вам нужно быть точным, а каждая цифра значимой.

0 голосов
/ 07 апреля 2009

Из Википедия :

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

С плавающей точкой быстро, но неточно. Если это приемлемый компромисс, используйте с плавающей запятой.

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