Плавающая точка и фиксированная точка: каковы плюсы / минусы? - PullRequest
19 голосов
/ 12 сентября 2010

Тип с плавающей запятой представляет собой число, сохраняя его значащие цифры и показатель степени отдельно в отдельных двоичных словах, чтобы он соответствовал 16, 32, 64 или 128 битам.

Тип с фиксированной запятой хранит числа с 2 словами,одна представляет целую часть, другая представляет часть после радиуса, в отрицательных показателях, 2 ^ -1, 2 ^ -2, 2 ^ -3 и т. д.

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

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

В программировании видеоигр все используют плавающую точку, потому что FPU делает это быстрее, или потому что падение производительностипросто пренебрежимо мало, или они делают свой собственный фиксированный тип?

Почему в C / C ++ нет фиксированного типа?

Ответы [ 8 ]

5 голосов
/ 12 сентября 2010

На уровне кода арифметика с фиксированной точкой - это просто целочисленная арифметика с подразумеваемым знаменателем.

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

Когда программное обеспечение не использует преимущества векторизации (например, SIMD на базе ЦП или GPGPU), арифметика с целыми числами и с фиксированной точкой работает быстрее, чем FPU. Когда используется векторизация, эффективность векторизации имеет гораздо большее значение, так что различия в производительности между фиксированной и плавающей точкой не имеют значения.

Некоторые архитектуры предоставляют аппаратные реализации для определенных математических функций, таких как sin, cos, atan, sqrt, только для типов с плавающей запятой. Некоторые архитектуры вообще не предоставляют никакой аппаратной реализации. В обоих случаях специализированные математические программные библиотеки могут предоставлять эти функции, используя только целочисленную или арифметику с фиксированной запятой. Часто такие библиотеки обеспечивают несколько уровней точности, например, ответы, которые являются точными только с точностью до N-битов, что меньше, чем полная точность представления. Версии с ограниченной точностью могут быть быстрее, чем версии с самой высокой точностью.

5 голосов
/ 12 сентября 2010

Это определение охватывает очень ограниченное подмножество реализаций с фиксированной запятой.

Было бы правильнее сказать, что в фиксированной точке сохраняется только мантисса, а показатель степени является постоянной величиной, определяемой априори.Не требуется, чтобы бинарная точка попадала в мантиссу, и определенно не требуется, чтобы она попадала на границу слова.Например, все перечисленное ниже является «фиксированной точкой»:

  • 64-битная мантисса, масштабированная на 2 -32 (это соответствует определению, приведенному в вопросе)
  • 64-битная мантисса, масштабируется до 2 -33 (теперь целая и дробная части не могут быть разделены границей октета)
  • 32-битная мантисса, масштабируется до 2 4 (теперь нет дробной части)
  • 32-битная мантисса, масштабируется до 2 -40 (теперь нет целочисленной части)

GPUсклонны использовать фиксированную точку без целочисленной части (обычно 32-битная мантисса, масштабированная до 2 -32 ).Поэтому такие API, как OpenGL и Direct3D, часто используют типы с плавающей запятой, которые могут содержать эти значения.Однако манипулирование целочисленной мантиссой часто более эффективно, поэтому эти API-интерфейсы также позволяют задавать координаты (в текстурном пространстве, цветовом пространстве и т. Д.).

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

4 голосов
/ 12 сентября 2010

Фиксированная точка широко используется в DSP и встроенных системах, где часто целевой процессор не имеет FPU, а фиксированная точка может быть реализована достаточно эффективно с использованием целочисленного ALU.

С точки зрения производительности, это аналогичноварьироваться в зависимости от целевой архитектуры и приложения.Очевидно, что если нет FPU, то фиксированная точка будет значительно быстрее.Когда у вас есть FPU, это также зависит от приложения.Например, выполнение некоторых функций, таких как sqrt () или log (), будет намного быстрее, если напрямую поддерживаться в наборе команд, а не реализовано алгоритмически.

Нет встроенного типа с фиксированной точкой в ​​C или C ++ Iпредставьте себе, потому что они (или, по крайней мере, C) рассматривались как языки системного уровня, и нужда в фиксированной точке в некоторой степени зависит от предметной области, а также, возможно, потому, что в процессоре общего назначения обычно нет прямой аппаратной поддержки для фиксированной точки.* В C ++ определение класса типа данных с фиксированной точкой с подходящими перегрузками операторов и связанными математическими функциями может легко преодолеть этот недостаток.Однако есть хорошие и плохие решения этой проблемы. хороший пример можно найти здесь: http://www.drdobbs.com/cpp/207000448. Ссылка на код в этой статье не работает, но я отследил ее до ftp: //66.77.27.238/sourcecode/ddj / 2008 / 0804.zip

1 голос
/ 12 февраля 2013

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

Например, вы можете определить ширину экрана / области просмотра как изменяющуюся от 0,0 до1,0, высота экрана от 0,0 до 1,0.Глубина слова от 0,0 до 1,0.и так далее.Матрица математика и т. Д. Делает вещи очень легко реализовать.Сделайте всю математику до того момента, когда вам нужно вычислить реальные пиксели на реальном размере экрана, скажем, 800x400.Проецируйте луч от глаза к точке на объекте в мире и вычислите, где он прокалывает экран, используя 0 к 1 математике, затем умножьте x на 800, y на 400 и поместите этот пиксель.

с плавающей запятой не хранит экспоненту и мантиссу по отдельности, а мантисса - это глупое число, которое остается после экспоненты и знака, как 23 бита, а не 16, 32 или 64 бита.

математика с плавающей точкой в ​​своей основе использует логику с фиксированной точкой с дополнительной логикой и необходимыми дополнительными шагами.По определению, сравнивать яблоки с яблоками математика с фиксированной точкой дешевле, потому что вам не нужно манипулировать данными на пути в alu и не нужно манипулировать данными на выходе (нормализовать).Когда вы добавляете IEEE и весь его мусор, который добавляет еще больше логики, больше тактов и т. Д. (Должным образом подписанные бесконечности, тихие и сигнальные nans, разные результаты для той же операции, если включен обработчик исключений).Как кто-то указал в комментарии в реальной системе, где вы можете фиксировать и перемещать параллельно, вы можете использовать некоторые или все процессоры и таким образом восстанавливать некоторые часы.как с плавающей запятой, так и с фиксированной тактовой частотой можно увеличить, используя огромное количество чипов, фиксированная останется дешевле, но плавающая может приблизиться к фиксированной скорости, используя эти виды трюков, а также параллельную работу.

1 голос
/ 12 сентября 2010

Вы должны быть осторожны при обсуждении «точности» в этом контексте.

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

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

и т. Д.

1 голос
/ 12 сентября 2010

Разница между вычислением с плавающей запятой и целочисленной математикой зависит от того, какой процессор вы имеете в виду. На чипах Intel разница в часах невелика. Int math все еще быстрее, потому что есть несколько целочисленных ALU, которые могут работать параллельно. Компиляторы также умны использовать специальные инструкции для расчета адреса для оптимизации сложения / умножения в одной инструкции. Конверсия тоже считается операцией, поэтому просто выберите свой тип и придерживайтесь его.

В C ++ вы можете создать свой собственный тип для математики с фиксированной запятой. Вы просто определяете как struct с одним int и переопределяете соответствующие перегрузки, и заставляете их делать то, что они обычно делают плюс сдвиг, чтобы вернуть запятую в правильное положение.

0 голосов
/ 29 июля 2016

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

Плюсы и минусы сводятся кскорость и ресурсы.На современных 32-битных и 64-битных платформах действительно нет необходимости использовать фиксированную точку.Большинство систем поставляются со встроенными FPU, которые специально спроектированы для работы с фиксированной точкой.Кроме того, большинство современных встроенных функций процессора поставляются с такими операциями, как набор SIMD, которые помогают оптимизировать методы на основе векторов посредством векторизации и развертывания.Таким образом, фиксированная точка имеет только обратную сторону.

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

0 голосов
/ 31 декабря 2013

Один из вопросов, который не был рассмотрен, - это энергопотребление. Хотя это сильно зависит от конкретной аппаратной архитектуры, обычно FPU потребляет гораздо больше энергии, чем ALU в ЦП, поэтому, если вы ориентируетесь на мобильные приложения, где важно энергопотребление, стоит рассмотреть реализацию алгоритма с фиксированной запятой.

...