2013-05-31 5 views
0

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

+2

Какая платформа? Какие функции у него есть? Почему бы просто не использовать умножение числа с плавающей запятой? – tmyklebu

+2

Почему бы вам не использовать фиксированную точку и управлять десятичной запятой самостоятельно? все равно плавающая точка. –

+3

Недостаточно информации. Вам нужно полное поведение IEEE754? т. е. вам нужно иметь дело с NaN, INF, денонмами и т. д.? Или вы можете справиться с умножением мантиссы с фиксированной точкой и * additive * '(2^EXP)'? –

ответ

1

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

Использование арифметики с фиксированной точкой в ​​C затруднено тем фактом, что нет встроенного типа данных фиксированной точки - каждая операция представляет собой явный вызов функции, который не является очень естественным или читаемым, в C++, однако возможно определите класс fixed с перегрузкой оператора и функции, так что использование неподвижной точки - это просто случай замены float или double на fixed, включая автоматические преобразования между типами. Одна такая библиотека, которая включает в себя обширную математическую библиотеку, а не просто простые арифметические операторы, можно найти here. В ARM он обычно в 5 раз быстрее, чем программная плавающая точка.

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

+1

'Если ваша цель имеет FPU, то она уже будет выполнять умножение с плавающей запятой так быстро, как это возможно. @Clifford - я уверен, что вы это знаете, но OP не может быть ... даже если у цели есть FPU, если среда сборки не настроена на использование встроенного FPU, и если FPU не включен, код будет по-прежнему использовать эмуляцию S/W. Поверьте мне, я все время вижу это ... – Dan

+0

@ Dan: Очень хорошая точка. Несколько лет назад я оценил LPC3180; и необычный чип ARM9 + VFP, даже если он настроен на использование FPU, реализация библиотеки sqrt() по-прежнему использовала алгоритм конвергенции, а не аппаратную инструкцию sqrt. Потребовалось некоторое выяснение, чтобы связать правильную библиотеку. – Clifford

Смежные вопросы