#optimization #floating-point #performance #numerical #fixed-point
Вопрос:
Для интенсивного вычисления чисел я рассматриваю возможность использования фиксированной точки вместо плавающей. Конечно, будет иметь значение, сколько байтов имеет размер типа с фиксированной точкой, на каком процессоре он будет работать, смогу ли я использовать (для Intel) MMX или SSE или любые другие новые возможности…
Мне интересно, стоит ли в наши дни, когда плавающая точка работает быстрее, чем когда-либо, задумываться о фиксированной точке? Существуют ли общие эмпирические правила, по которым мы можем сказать, что это будет иметь значение более чем на несколько процентов? Каков обзор с 35 000 футов численных показателей? (Кстати, я предполагаю, что это обычный процессор, как на большинстве компьютеров, а не DSP или специализированные встроенные системы.)
Ответ №1:
Это все равно того стоит. С плавающей точкой это быстрее, чем в прошлом, но и с фиксированной точкой тоже. И исправлено по-прежнему единственный способ, если вы заботитесь о точности, превышающей ту, которая гарантирована IEEE 754.
Комментарии:
1. 1, есть ли у вас какое-либо программное обеспечение для сравнительного анализа, которое вы используете для проверки этого для различных архитектур. Я пришел к тому же выводу с помощью профилирования, но это была изрядная работа, и результаты относятся только к конкретному оборудованию, которое я тестировал. Заинтересованы в том, чтобы увидеть разницу на мобильных устройствах с ARM, а также на более распространенных устройствах Intel и AMD.
Ответ №2:
В ситуациях, когда вы имеете дело с очень большими объемами данных, фиксированная точка может быть в два раза эффективнее памяти, например, целое число длиной в четыре байта, а не двойное число в восемь байт. Метод, часто используемый в больших геопространственных наборах данных, заключается в сведении всех данных к общему источнику, чтобы можно было удалить наиболее значимые биты, а для остальных работать с целыми числами с фиксированной точкой. Плавающая точка важна только в том случае, если точка действительно плавает, т. Е. вы имеете дело с очень широким диапазоном чисел с очень высокой точностью.
Комментарии:
1. Отличный комментарий о «плавающей» части плавающей точки — поразил мой разум, и это так очевидно в ретропекте.
Ответ №3:
Еще одна веская причина использовать фиксированную десятичную дробь заключается в том, что округление намного проще и предсказуемо. Большинство финансовых программ использует десятичные дроби произвольной точности с фиксированной точкой и округлением до половины для представления денег.
Комментарии:
1. Совершенно верно. Это также применимо при реализации детерминированного распределенного моделирования в реальном времени. Тонкие различия в реализациях IEEE-754 могут привести к чрезвычайно трудным для поиска ошибкам, когда одно и то же вычисление дает разные результаты в разных распределенных системах, что приводит к их отклонению от ожидаемого состояния моделирования. Смотрите эту статью .
Ответ №4:
Почти ВСЕГДА быстрее использовать фиксированную точку (опыт x86, pentium, 68k и ARM). Однако это может также зависеть от типа приложения. Для графического программирования (одно из моих основных применений фиксированной точки) Я смог оптимизировать код, используя готовые таблицы косинусов, таблицы журналов и т. Д. Но и основные математические операции также оказались быстрее.
Комментарий к финансовому программному обеспечению. В предыдущем ответе было сказано, что фиксированная точка полезна для финансовых расчетов. По собственному опыту (разработка крупной системы управления казначейством и большой опыт обработки кредитных карт) Я бы не стал использовать фиксированную точку. У вас будут ошибки округления с использованием либо плавающей, либо фиксированной точки. Мы всегда используем целые суммы для представления денежных сумм, подсчитывая минимальную возможную сумму (1c для евро или доллара). Это гарантирует, что никакие частичные суммы никогда не будут потеряны. При выполнении сложных вычислений значения преобразуются в двойные, применяются правила округления для конкретного приложения, и результаты преобразуются обратно в целые числа.
Комментарии:
1. В моем случае (расчет комиссий) мы используем Java BigDecimal, который не является точно фиксированной точкой, но довольно близок к ней. Правила округления действительно специфичны для конкретного приложения, но в 9 случаях из 10 они являются половинчатыми.
2. Под сложными расчетами вы подразумеваете увеличение процентов, налоговых ставок или что-то в этом роде? Для добавления и вычитания сумм на счете, не будет ли фиксированный в значительной степени Единственным Верным способом? Вы используете поплавки в этом случае?
3. Поиск по таблице является важным соображением в том, что я делаю, и в том, что может понадобиться многим другим, — это непрактично с плавающей запятой. Очень хорошее замечание.
Ответ №5:
Используйте фиксированную точку, когда аппаратное обеспечение не поддерживает плавающую точку или аппаратная реализация отстой.
Также будьте осторожны при создании классов для него. То, что вы считаете быстрым, на самом деле может оказаться собакой, когда дело доходит до профилирования из-за (не)необходимых копий классов. Однако это другой вопрос для другого времени.
Комментарии:
1. Было бы интересно узнать, какое оборудование в наши дни не поддерживает плавающую точку. Похоже, что теперь даже старый потрепанный шнурок для обуви с плавающей запятой… 8 пенсов
2. (кстати, я ношу сандалии здесь, во Флориде, так что я не в курсе технологии шнурков)
3. @DarenW: Nintendo DS (которую я все еще считаю несколько новой) не поддерживает аппаратную поддержку с плавающей запятой. Это единственное портативное устройство, для которого я разработал, но я бы предположил, что многие другие карманные компьютеры также не имеют FPU.
4. Недавно я столкнулся с каким-то бизнесом с процессором Blackfin ARM, который, по-видимому, не поддерживает аппаратную арифметику с плавающей запятой и выполняет такие вычисления в программном обеспечении, что довольно дорого.
5. Многие DSP (цифровые сигнальные процессоры) не поддерживают плавающую точку.
Ответ №6:
Еще одна причина использования фиксированной точки заключается в том, что ARM
на устройствах, таких как мобильные телефоны и планшеты, отсутствует FPU (по крайней мере, на многих из них).
Для разработки приложений реального времени имеет смысл оптимизировать функции с использованием арифметики с фиксированной точкой. Существуют реализации FFT (Быстрое преобразование Фурье), очень важные для графики, которые повышают ее эффективность за счет использования арифметики с плавающей запятой.
Комментарии:
1. Я думаю, что ваше последнее предложение должно было быть «полагаться на арифметику с фиксированной точкой».
Ответ №7:
Поскольку вы используете процессор общего назначения, я бы посоветовал не использовать фиксированную точку, если только производительность не настолько важна для вашего приложения, что вам приходится считать каждый тик. Хлопоты по внедрению фиксированной точки и решению таких проблем, как переполнение, просто не стоят того, когда у вас есть процессор, который сделает это за вас.
ИМХО, фиксированная точка необходима только в том случае, если вы используете DSP без аппаратной поддержки операций с плавающей запятой.