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


Это все равно того стоит. Плавающая точка работает быстрее, чем раньше, но и фиксированная точка тоже. И исправление по-прежнему является единственным выходом, если вы заботитесь о точности, превышающей гарантированную IEEE 754.
Поскольку вы используете ЦП общего назначения, я бы посоветовал не использовать фиксированную точку, за исключением случаев, когда производительность настолько критична для вашего приложения, что вам нужно считать каждый тик. Проблемы с реализацией фиксированной точки и решением таких проблем, как переполнение, просто не стоят того, когда у вас есть процессор, который сделает это за вас.
IMHO, фиксированная точка необходима только тогда, когда вы используете DSP без аппаратной поддержки операций с плавающей запятой.
Еще одна веская причина использовать фиксированное десятичное число - округление намного проще и предсказуемо. В большинстве финансовых программ для обозначения денег используются десятичные дроби произвольной точности с фиксированной точкой и округлением до половины.
Совершенно верно. Это также применимо при реализации детерминированного распределенного моделирования в реальном времени. Незначительные различия в реализациях IEEE-754 могут привести к тому, что очень трудно найти ошибки, когда один и тот же расчет дает разные результаты в разных распределенных системах, что приводит к их отклонению от ожидаемого состояния моделирования. См. эта статья.
Используйте фиксированную точку, когда оборудование не поддерживает плавающую точку или аппаратная реализация - отстой.
Также будьте осторожны, когда делаете для него классы. То, что, по вашему мнению, будет быстрым, на самом деле может оказаться собакой, когда дело доходит до профилирования из-за (не) необходимых копий классов. Однако это другой вопрос, но в другой раз.
Было бы интересно узнать, какое оборудование в наши дни не поддерживает операции с плавающей запятой. Похоже, что теперь даже старая крысиная оборванная шнурка на ботинке работает с плавающей запятой ... 8P
(кстати, я ношу сандалии здесь, во Флориде, так что я не разбираюсь в технологии шнурков)
@DarenW: Nintendo DS (которую я все еще считаю несколько новой) не поддерживает операции с плавающей запятой через оборудование. Это единственное портативное устройство, для которого я разработал, но я предполагаю, что многие другие портативные устройства также не имеют FPU.
Недавно я столкнулся с бизнесом с процессором Blackfin ARM, который явно не поддерживает арифметику с плавающей запятой аппаратно и выполняет такие вычисления в программном обеспечении, что довольно дорого.
Многие DSP (процессоры цифровых сигналов) не поддерживают операции с плавающей запятой.
@ graham.reeds Или, что лучше, просто используйте функции C, чтобы избежать возможных накладных расходов.
Почти ВСЕГДА быстрее использовать фиксированную точку (опыт x86, Pentium, 68k и ARM). Однако это также может зависеть от типа приложения. Для графического программирования (одно из моих основных применений фиксированной точки) я смог оптимизировать код, используя предварительно построенные таблицы косинусов, журнальные таблицы и т. д. Но также и основные математические операции оказались быстрее.
Комментарий к финансовому софту. В предыдущем ответе было сказано, что фиксированная точка полезна для финансовых расчетов. Судя по моему собственному опыту (разработка крупной системы управления казначейством и большой опыт обработки кредитных карт), я бы НЕ использовал фиксированную точку. У вас будут ошибки округления с плавающей или фиксированной точкой. Мы всегда используем целые суммы для представления денежных сумм, считая минимально возможную сумму (1 цент за евро или доллар). Это гарантирует, что частичные суммы никогда не будут потеряны. При выполнении сложных вычислений значения преобразуются в двойные, применяются правила округления для конкретных приложений, а результаты конвертируются обратно в целые числа.
В моем случае (расчет комиссионных) мы используем Java BigDecimal, что не совсем фиксированная точка, но довольно близко подходит. Правила округления действительно зависят от приложения, но в 9 случаях из 10 они наполовину четные.
Под сложными расчетами вы имеете в виду начисление сложных процентов, налоговых ставок или чего-то подобного? Не будет ли фиксированный способ сложения и вычитания сумм в учетной записи в значительной степени Единственным верным путем? Вы используете в этом случае поплавки?
Поиск в таблице - важное соображение в том, что я делаю, и в том, что может понадобиться многим другим - это непрактично с плавающей запятой. Очень хороший момент.
В ситуациях, когда вы имеете дело с очень большими объемами данных, фиксированная точка может быть в два раза эффективнее памяти, например четырехбайтовое целое число в отличие от восьмибайтового двойного. В больших наборах геопространственных данных часто используется методика сведения всех данных к общему источнику, чтобы можно было удалить наиболее значимые биты и работать с целыми числами с фиксированной запятой для остальных. Плавающая точка важна только в том случае, если точка действительно плавающая, т.е. вы имеете дело с очень широким диапазоном чисел с очень высокой точностью.
Замечательный комментарий о «плавающей» части плавающей запятой - широко раскрыл мой разум и настолько очевиден в ретроспективе.
Другой причиной для использования фиксированной точки заключается в том, что устройства ARM, такие как мобильные телефоны и планшеты, не имеют FPU (по крайней мере, многие из них).
Для разработки приложений реального времени имеет смысл оптимизировать функции, используя арифметику с фиксированной точкой. Существуют реализации БПФ (быстрого преобразования Фурье), очень важного для графики, которые основывают свои улучшения на эффективности на основе арифметики с плавающей запятой.
Я думаю, что ваше последнее предложение было задумано как «полагаться на арифметику с фиксированной точкой».
+1, есть ли у вас какое-либо программное обеспечение для тестирования производительности, которое вы используете, чтобы проверить это для разных архитектур. Я пришел к такому же выводу с помощью профилирования, но это была изрядная работа, и результаты относятся только к конкретному оборудованию, которое я тестировал. Интересно увидеть разницу на мобильных устройствах с ARM, а также на более распространенных Intel и AMD.