2013-10-01 1 views
3

Как математика с плавающей запятой выполняется на процессоре без блока с плавающей запятой? например, младшие 8-битные микроконтроллеры.Плавающая математическая точка на процессоре, который ее не поддерживает?

+1

Посмотрите на [avr-libc] (http://www.nongnu.org/avr-libc/) - он использует целые математические выражения для реализации математических функций и опирается на поддержку компилятора для манипулирования значениями с плавающей запятой , Связывание функций поддержки математики может быть очень дорого. –

+0

Связанные: http://stackoverflow.com/questions/9060852/how-floats-are-computed-on-a-machine-without-an-fpu – Jeff

ответ

4

Посмотрите на эту статью: http://www.edwardrosten.com/code/fp_template.html

(из этой статьи)

Во-первых, вы должны думать о том, чтобы представить число с плавающей точкой в ​​памяти:

struct this_is_a_floating_point_number 
{ 
    static const unsigned int mant = ???; 
    static const int   expo = ???; 
    static const bool   posi = ???; 
}; 

Тогда вам 'd должны рассмотреть, как делать базовые вычисления с этим представлением. Некоторые могут быть легко реализованы и быть довольно быстрыми во время выполнения (умножить или разделить на 2 приходят на ум)

Отдела может быть сложнее, и, например, алгоритм Ньютонов может быть использован для вычисления ответа.

Наконец, интеллектуальные аппроксимации и сгенерированные значения в таблицах могут ускорить вычисления во время выполнения.

Много лет назад шаблоны С ++ помогли мне получить вычисления с плавающей точкой на Intel 386 SX

В конце концов, я узнал много математики и C++, но решил в то же самое время, чтобы купить сопроцессор.

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

+1

Ряд приближенных функций Тейлора вблизи точки.Один из них ** чаще всего стремится к равномерно точному приближению на интервале, что делает ряд Тейлора неправильным инструментом для использования. http://lolengine.net/blog/2011/12/21/better-function-approximations –

+1

@PascalCuoq - Приятное дополнение. Я согласен, что это зависит от требований. Дело не в том, что я поклонник серии Тейлора, для меня это был глазник, чтобы приблизить функцию, используя серию. –

3

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

Посмотрите на страницу википедии: Floating-point_unit#Floating-point_library, как вы можете найти более подробную информацию.

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

1

Прочитайте «Полная разборка Spectrum ROM» на странице http://www.worldofspectrum.org/documentation.html, чтобы увидеть примеры вычислений с плавающей запятой на 8-битном процессоре Z80.

Для таких функций, как синусоидальные функции, вы предварительно компилируете несколько значений, затем интерполируйте с помощью Chebyshev polynomials.

2

Короткий ответ «медленно». Специализированное оборудование может выполнять такие задачи, как извлечение групп бит, которые не обязательно быстро выровнены по байтам. Программное обеспечение может делать все, что может быть сделано специализированным оборудованием, но для этого требуется гораздо больше времени.