Вопрос

Для интенсивного сокращения чисел я рассматриваю использование фиксированной точки вместо плавающей точки. Конечно, будет иметь значение, сколько байтов имеет размер с фиксированной запятой, на каком процессоре он будет работать, если я смогу использовать (для Intel) MMX или SSE или что-нибудь новое ...

Мне интересно, стоит ли в наши дни, когда плавающая точка работает быстрее, чем когда-либо, стоит ли когда-нибудь рассматривать фиксированную точку? Существуют ли общие правила, по которым мы можем сказать, что это будет иметь значение более чем на несколько процентов? Каков обзор от 35 000 футов числовой производительности? (Кстати, я полагаю, что общий ЦП, как в большинстве компьютеров, а не DSP или специализированных встроенных систем.)

Это было полезно?

Решение

Это все еще стоит. С плавающей точкой быстрее, чем в прошлом, но с фиксированной точкой тоже. И фиксированный - все еще единственный путь, если вы заботитесь о точности, превышающей ту, которая гарантирована IEEE 754.

Другие советы

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

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

Практически ВСЕГДА быстрее использовать фиксированную точку (опыт x86, pentium, 68k и ARM). Это может, однако, также зависеть от типа приложения. Для графического программирования (одно из моих основных применений с фиксированной точкой) я смог оптимизировать код, используя предварительно построенные косинусные таблицы, таблицы журналов и т. Д. Но и основные математические операции также оказались быстрее.

Комментарий к финансовому программному обеспечению. В предыдущем ответе было сказано, что фиксированная точка полезна для финансовых расчетов. Исходя из собственного опыта (разработка крупной системы управления казначейством и большой опыт обработки кредитных карт), я бы НЕ использовал фиксированную точку. У вас будут ошибки округления при использовании плавающей или фиксированной точки. Мы всегда используем целые суммы для представления денежных сумм, считая минимально возможную сумму (1c для евро или доллара). Это гарантирует, что никакие частичные суммы никогда не будут потеряны. При выполнении сложных вычислений значения преобразуются в двойные, применяются правила округления для конкретных приложений, а результаты преобразуются обратно в целые числа.

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

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

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

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

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

ИМХО, фиксированная точка необходима только при использовании DSP без аппаратной поддержки операций с плавающей запятой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top