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

С какой целью у java есть примитивный тип float?

Можете ли вы мне пояснить использование примитива float в Java?

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

Я также помню, что когда я работал с AWT и Swing, у меня были некоторые проблемы с использованием float или double (например, с использованием Point2D.Float или Point2D.Double).

Итак, я вижу только 2 преимущества float над double:

  • Ему нужно всего 4 байта, а double - 8 байт

  • Модель памяти Java (JMM) гарантирует, что операция присваивания является атомарной с плавающими переменными, в то время как она не является атомарной с double.

Есть ли другие случаи, когда float лучше, чем double? Вы используете float в своих приложениях?

4b9b3361

Ответ 1

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

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

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

Если у вас действительно есть веская причина для его использования, в новом коде я обычно избегал бы "float".

Ответ 2

Те две причины, которые вы только что дали, огромны.

Если у вас есть 3D-объем, который 1k на 1k на 64, а затем у вас много временных точек этих данных, а затем вы хотите создать фильм с прогнозами максимальной интенсивности, тот факт, что float составляет половину размера double, может быть разница между быстрой и быстрой обработкой, поскольку у вас закончилась нехватка памяти.

Атоматичность также огромна, с точки зрения резьбы.

Всегда будет компромисс между скоростью/производительностью и точностью. Если у вас есть число меньше 2 ^ 31 и целое число, то целое число всегда является лучшим представлением этого числа, чем float, только из-за потери точности. Вы должны будете оценить свои потребности и использовать соответствующие типы для своих проблем.

Ответ 3

Я думаю, вы прибивали его, когда упоминаете память, с поплавками в два раза меньше.

Использование поплавков может демонстрировать улучшенную производительность по удвоению для приложений, обрабатывающих большие массивы чисел с плавающей запятой, так что ограничение полосы пропускания памяти является ограничивающим фактором. Переключившись на float[] из double[] и уменьшив вдвое размер данных, вы удвоите пропускную способность, так как в определенное время может быть выбрано в два раза больше значений. Хотя процессор имеет немного больше работы, чтобы преобразовать float в double, это происходит параллельно с извлечением памяти, при этом выборка занимает больше времени.

Для некоторых приложений потеря точности может стоить торговли для повышения производительности. Затем снова...: -)

Ответ 4

Итак, преимущества поплавков:

  • Требуется только 4 байта
  • Атомное назначение
  • Арифметика должна быть быстрее, особенно на 32-битных архитектурах, поскольку существуют определенные байтовые коды с плавающей запятой.

Способы смягчения их при использовании удвоений:

  • Купите больше ОЗУ, это действительно дешево.
  • Используйте volatile double, если вам нужно присвоение атомов.
  • Выполняйте тесты, проверяйте производительность каждого из них, если вы действительно быстрее, вы не можете многое сделать.

Кто-то еще сказал, что это похоже на короткий аргумент vs int, но это не так. Все целые типы (включая логические), кроме long, сохраняются как 4 байтовые целые числа в модели памяти Java, если они не хранятся в массиве.

Ответ 5

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

Команды SSE также могут работать с 4 параллельными платами вместо 2, но я сомневаюсь, что JIT использует их. Возможно, я ошибаюсь.