Подтвердить что ты не робот

Когда использовать Float

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

Итак, когда целесообразно использовать float?

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

4b9b3361

Ответ 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) становится важным при работе с очень большими наборами данных (и уменьшение размера обычно повышает производительность, а также из-за кэширования и т.д.)