Когда целесообразно использовать типы данных с плавающей точностью?

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

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

7 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам