Когда использовать фиксированную точку в наши дни

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

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

Загадки Python - Генерация простых чисел!
Загадки Python - Генерация простых чисел!
Обычно существует несколько способов решения задач даже пограничной сложности. Как же определить оптимальное и эффективное решение?
23
0
3 725
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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

+1, есть ли у вас какое-либо программное обеспечение для тестирования производительности, которое вы используете, чтобы проверить это для разных архитектур. Я пришел к такому же выводу с помощью профилирования, но это была изрядная работа, и результаты относятся только к конкретному оборудованию, которое я тестировал. Интересно увидеть разницу на мобильных устройствах с ARM, а также на более распространенных Intel и AMD.

SmacL 09.06.2011 16:20

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

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

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

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

Engineer 10.04.2015 17:11

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

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

Было бы интересно узнать, какое оборудование в наши дни не поддерживает операции с плавающей запятой. Похоже, что теперь даже старая крысиная оборванная шнурка на ботинке работает с плавающей запятой ... 8P

DarenW 06.10.2008 03:44

(кстати, я ношу сандалии здесь, во Флориде, так что я не разбираюсь в технологии шнурков)

DarenW 06.10.2008 03:44

@DarenW: Nintendo DS (которую я все еще считаю несколько новой) не поддерживает операции с плавающей запятой через оборудование. Это единственное портативное устройство, для которого я разработал, но я предполагаю, что многие другие портативные устройства также не имеют FPU.

Ponkadoodle 07.02.2010 06:11

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

neuviemeporte 05.11.2010 20:27

Многие DSP (процессоры цифровых сигналов) не поддерживают операции с плавающей запятой.

Tor Klingberg 01.04.2015 16:49

@ graham.reeds Или, что лучше, просто используйте функции C, чтобы избежать возможных накладных расходов.

Engineer 10.04.2015 18:38

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

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

В моем случае (расчет комиссионных) мы используем Java BigDecimal, что не совсем фиксированная точка, но довольно близко подходит. Правила округления действительно зависят от приложения, но в 9 случаях из 10 они наполовину четные.

ddimitrov 05.10.2008 17:28

Под сложными расчетами вы имеете в виду начисление сложных процентов, налоговых ставок или чего-то подобного? Не будет ли фиксированный способ сложения и вычитания сумм в учетной записи в значительной степени Единственным верным путем? Вы используете в этом случае поплавки?

DarenW 06.10.2008 03:42

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

DarenW 06.10.2008 03:48

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

Замечательный комментарий о «плавающей» части плавающей запятой - широко раскрыл мой разум и настолько очевиден в ретроспективе.

Curyous 23.03.2011 04:42

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

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

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

Engineer 10.04.2015 17:34

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