Когда использовать Float
Несколько лет назад я усердно изучил проблемы точности с поплавками, поэтому я прекратил использовать их. Тем не менее, я все еще сталкиваюсь с кодом, использующим float, и это заставляет меня съеживаться, потому что я знаю, что некоторые вычисления будут неточными.
Итак, когда целесообразно использовать float?
EDIT:
Как информация, я не думаю, что я столкнулся с программой, где точность числа не важна. Но мне бы хотелось услышать примеры.
Ответы
Ответ 1
Короткий ответ: вам нужно использовать float, когда вы точно знаете, что вы делаете и почему.
Длинный ответ: floats (в отличие от удваивается), насколько я знаю, на самом деле не используются больше вне 3D-API. Поплавки и двойники имеют одинаковые характеристики производительности на современных процессорах, удваивается несколько больше и все. Если у вас есть сомнения, просто используйте double.
О да, и используйте десятичный для финансовых расчетов, конечно.
Ответ 2
Все вычисления с плавающей запятой неточно в общем случае, плавает только больше, чем удваивает. Если вы хотите получить дополнительную информацию, прочитайте
Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой
Что касается того, когда использовать поплавки - они часто используются, когда точность менее важна, чем сохранение памяти. Например, простые симуляции частиц в видеоиграх.
Ответ 3
Есть много случаев, когда вы хотели бы использовать float
. Однако я не понимаю, что вы можете использовать вместо этого. Если вы имеете в виду использование double
вместо float
, то да, в большинстве случаев вы хотите это сделать. Однако double
также будет иметь проблемы с точностью. Вы должны использовать decimal
всякий раз, когда важна точность.
float
и double
очень полезны во многих приложениях. decimal
- дорогой тип данных, а его диапазон (величина наибольшего числа, который он может представлять) меньше double
. Обычно компьютеры имеют специальную аппаратную поддержку этих типов данных. В научных вычислениях они используются много. В основном, это первичные дробные типы данных, которые вы хотите использовать. Однако в денежных расчетах, где точность чрезвычайно важна, decimal
- это путь.
Ответ 4
Во-первых, никогда не используйте float или double, если вы хотите точно представлять десятичные значения - используйте либо целые типы (int, long и т.д.), либо десятичные (это всего лишь целочисленный тип с коэффициентом масштабирования). Поплавки и двойники преобразуются внутренне в экспоненциальное представление в базе 2, а числа, представленные точно в экспоненциальном представлении в базе 10, вообще не могут быть представлены точно. (Например, число 10 представлено приблизительно только поплавками или удвоениями).
Во-вторых, с точки зрения точности это зависит от того, что вам нужно. Я не согласен с вашими чувствами в том, что нет никаких расчетов, где точность не имеет значения. Обычно у вас есть определенная потребность в том, чтобы ваш конечный результат был точным, 3 цифры. Не имеет смысла искать максимально возможную точность, если ваш вход имеет только ограниченную точность - скажем, вы весите около 5 г муки, а ваш вес имеет точность до 0,5 г. Тем не менее, промежуточный расчет обычно выигрывает от более высокой точности, но что более важно, чем высокая точность, если нечасто скорость.
В-третьих, при подготовке серии вычислений, скажем, в цикле, вам нужно знать, что вы делаете, когда имеете дело с любыми неточными вычислениями - вы понесете ошибки округления, и некоторые алгоритмы могут не прийти к ответу на любые степень точности. Понимание этих проблем в деталях может потребовать курса в численном анализе. Это не зависит от того, выбираете ли вы поплавки или удваиваете для своих расчетов.
Для вычислений с плавающей запятой я обычно бывал с двойниками, так как они более общие и быстрее, чем плавающие. Тем не менее, поплавки меньше, и если вам нужно хранить много из них, они являются выбором для предотвращения проблем с производительностью из-за промахов в кеше.
Насколько мне известно, обработка с плавающей запятой поддерживается в аппаратных средствах для удвоения, но не плавает, поэтому использование поплавков приводит к двойному преобразованию. Тем не менее, некоторые процедуры останавливались бы быстрее при вычислении значения итеративно при передаче float, так как это означает, что вам нужно только около 8 цифр с точностью до около 16 для удвоений.
Ответ 5
Самая распространенная причина, по которой я мог думать, - это сэкономить место. Не то чтобы об этом часто стоит беспокоиться, но в некоторых случаях это имеет значение. Поплавок занимает вдвое больше памяти, чем двойной, поэтому вы можете получить вдвое больше в одном и том же пространстве. Например, у меня был массив чисел, который был слишком большим, чтобы вписываться в ОЗУ как удваиваемые, но поместился как массив, плавающий.
Ответ 6
На самом деле существует одна вещь, когда все еще принято использовать поплавки aka
"одиночная точность" с 32 битами: графические приложения и печать.
Другая причина - графические карты с их графическими процессорами. Чем меньше тип данных, тем быстрее
операция, поскольку меньшее количество бит должно транспортироваться. Целочисленные типы данных имеют проблемы
с изображениями с высоким динамическим диапазоном: глаз может функционировать в диапазоне яркости
1:10 ^ 13 и различается ок. 4000. Поэтому, в то время как целочисленные типы данных могут хранить количество уровней, они не могут сохранить яркость фона, в то время как у float нет проблем с этим. Фактически IEEE 754R позволяет использовать новый "половинной точности" с 16 бит и 10 бит
мантисса, которая теряет некоторую точность, но позволит еще большую скорость.
OpenGL и DirectX, например. широко использовать float.
Глаз очень прощает артефакты, поэтому проблем нет.
Все другие средства массовой информации, построенные на графике, наследуют поплавки как удобную меру.
Мантисса имеет 24 бита, что позволяет, следовательно, 2 ^ 24 = 16,7 миллиона шагов подряд.
Если у вас есть принтер с разрешением 2000 т/д, вы все равно можете печатать 213x213 м
листы. Более чем достаточная точность.
Ответ 7
Использовать float для производительности и размера. Если вы можете управлять точностью потери.
Несмотря на то, что современный процессор занимает столько же времени для обработки операций с однократной и двойной точностью, вы иногда можете увеличить пропускную способность, если используете поплавки с инструкциями SIMD (MMX/SSE/etc. on x86).
Регистры SSE имеют ширину 128 бит и могут содержать 4 поплавки или 2 удвоения. Таким образом, если вы используете правильно, вы можете делать в два раза больше операций с поплавками по сравнению с удвоениями.
Уменьшение размера (4 байта вместо 8) становится важным при работе с очень большими наборами данных (и уменьшение размера обычно повышает производительность, а также из-за кэширования и т.д.)