Перейти к содержанию
    

Ещё вот подумал об использовании фиксированной точки по сравнению с плавающей. В большинстве практических задач известен диапазон обрабатываемых величин и, как ни странно, диапазон не такой уж большой. Если взять к примеру 40-битную фиксированную точку, то диапазон предcтавимых чисел составит 240 дБ. Можно с Сатурна сообщения обрабатывать :-). В то же время быстродействие обработки фиксточки на порядок выше по сравнению с плавающей. Так что, стоит покумекать и принормировать свою задачу к определенному диапазону.

В плавучке мантисса занимает 23 бита плюс один не хранимый всегда равный 1. Итого 3 байта. Чтобы перемножить два числа нужно перемножить мантиссы. AVR выполняет умножение байт на байт за одну команду, чтобы перемножить два 3-байтовых числа нужно 9 команд умножения. И порядки сложить.

В плавучке вычисление spline = ds + tmp * (cs + tmp * (bs + as*tmp)); - то есть 6 операций - занимает 860 тактов (см ссылку выше в теме). то есть 146 тактов на операцию.

 

А чтобы перемножить два 40 битных числа с фиксированной точкой, то есть 5 байтных, нужно 25 команд умножения. Каждая команда умножения даёт два байта результата, которые нужно прибавить к промежуточному результату (для всех кроме 5 первых умножений). То есть нужно почти в 2 раза больше команд сложения ещё, 40 штук вроде. Итого уже 25*2+40*1=90 тактов. Это без учёта пересылок, вызова функций и т.д.

 

Таким образом 40 битная фиксированная точка может оказаться и вовсе не быстрее плавучки. И по крайней мере не на порядок быстрее.

 

я и так вынужден хранить в плавучке только дробные части чисел а целые - в отдельных байтах, чтобы не терять абсолютную точность!

 

Выглядит сомнительно. Плавучка не теряет точности целой части от того что появляется дробная. Вы точно убедились что это необходимо?

 

А ещё в требуемой заказчиком mega48P запросто может нехватить программной памяти! Её там всего 4 кб. Мало.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выглядит сомнительно. Плавучка не теряет точности целой части от того что появляется дробная. Вы точно убедились что это необходимо?

При увеличении абсолютного значения числа его точность (ака точность дробной части) теряется. Поэтому необходимо.

А ещё в требуемой заказчиком mega48P запросто может нехватить программной памяти! Её там всего 4 кб. Мало.

Что делать - будем пытаться вписаться. Тем более, что на самом деле её там всего 512 байт :rolleyes:

http://www.ekits.ru/index.php?productID=2567

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Верно - я прокололся :) Просто чаще встречался с ограничениями в нехватке ОЗУ, вот и тут не вдумавшись подумал что речь про неё, ан нет. Гарвардская архитектура, однако :) А программной памяти там да - 4кб, и туда ещё надо будет засунуть модуль связи, математику расчета движения, ПИД-регулятор тока, сервисные функции индикации и таблицу синуса... Тоже придется проявлять чудеса впихивания.

 

На крайний случай конечно остается вариант тяжеловесную внешнюю связь вынести во вторую мегу48 с транзитом в основную управляющую тоже мегу48 по SPI - если не будем влезать, то попробуем так. А может и 3 меги затребуем - пусть осваивает складские запасы :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В плавучке мантисса занимает 23 бита плюс один не хранимый всегда равный 1. Итого 3 байта. Чтобы перемножить два числа нужно перемножить мантиссы. AVR выполняет умножение байт на байт за одну команду, чтобы перемножить два 3-байтовых числа нужно 9 команд умножения. И порядки сложить. В плавучке вычисление spline = ds + tmp * (cs + tmp * (bs + as*tmp)); - то есть 6 операций - занимает 860 тактов (см ссылку выше в теме). то есть 146 тактов на операцию.

А чтобы перемножить два 40 битных числа с фиксированной точкой, то есть 5 байтных, нужно 25 команд умножения. Каждая команда умножения даёт два байта результата, которые нужно прибавить к промежуточному результату (для всех кроме 5 первых умножений). То есть нужно почти в 2 раза больше команд сложения ещё, 40 штук вроде. Итого уже 25*2+40*1=90 тактов. Это без учёта пересылок, вызова функций и т.д.

Таким образом 40 битная фиксированная точка может оказаться и вовсе не быстрее плавучки. И по крайней мере не на порядок быстрее

1) Ну да, надо 9 команд умножения и 6 сложения, чтобы перемножить 3-байтные мантиссы двух чисел с плавающей запятой. Но это не всё, ещё со знаком повозиться, еще надо 48-битную мантиссу результата отнормировать, и экспоненту подправить, ещё надо сравнить с мин. и мах. числом...Вы всё же посмотрите на подпрограммы умножения двух чисел с плавающей запятой. Что интересно, сложение в плавучке не такое простое дело, как может показаться. Надо мантиссы выровнять, сложить, результат пронормировать...

 

2) Теперь про 40-битные числа с фиксированной точкой. Ну 40 я взял от фонаря, вы и ухватились, а если бы я сказал 64? Поэтому давайте подойдём к вопросу с разумных позиций. Для хранения плавточки нужно 32 бита, т.е. 4 байта., вот и возьмём для фиксточки те же 32 бита. Диапазон представления тоже не маленький 192 дБ. Сигналы с Луны можно обработать :-). Умножение 32х32 я бы точно уложил в 100 тактов, ну а сложение - 4 такта. Вгрубе для вычисления spline хватит 300 тактов против ваших 900 (это ещё проверить бы надо), в ТРИ раза, не хило, хоть и не на порядок.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно вас это позабавит, но я написал на 1С симулятор работы с моим МК, плавучей библиотекой, ОЗУ.... :) С выводом любой - текстовой и графической отладочной информации, статистики и прочего по результатам работы алгоритма, возможностью сначала написать и отладить алгоритм в человеческой математике, проверить графически результаты его работы и там же перевести и посмотреть в математике МК. Ошибки ловятся на ура - я просто не представляю, как бы я их ловил в АВР-студио, без графики, с долгим временем симулирования. А если добавить в мой симулятор регистры и asm команды (что несложно но врядли нужно), будет почти труЪ :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1С? Нда.. Месье однако знает толк в извращениях и совсем не слыхал про протеус для симуляции МК. И про маткад для

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про Протеус и Маткад слышал, но ни разу не видел и не пользовался. И мне действительно проще написать симулятор в 1С, чем ставить вышеупомянутый софт, разбираться в его интерфейсах и возможностях, спрашивать как там сделать то-то и се-то и расстраиваться если что-то там сделать нельзя. А в моем симуляторе я сам сделаю все что мне нужно, быстро и понятно. Это же ведь всего лишь инструмент для работы - а он должен быть удобен и делать то что нужно, и все. Можно конечно относиться к 1С с пренебрежением, но на текущий момент мне помогает. Куратор вообще говорит - хоть в Экселе в Вижуал Бэйсике макросы пиши и хоть какие графики строй - лишь бы результат был :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оффтоп — просто вспомнилось.

Где-то когда-то в эхах прозвучало по поводу какого-то вируса «в отместку я антивирус написал на Clipper-е»

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Маленькое замечание.

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

Может и Атмел такое сделал под свои камни, а вам только поискать нужно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может и Атмел такое сделал под свои камни, а вам только поискать нужно?
Нет. Атмел ничего "такого" не делал.

Максимум fixed-point арифметика в avr-gcc.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет. Атмел ничего "такого" не делал.

Максимум fixed-point арифметика в avr-gcc.

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

Хм. хотя они вроде сразу нормальный Си предлагали, наверное тогда да, никто на ассемблере и не извращался в AVR.

 

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

 

PPS Ну нет так нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С наличием плавучей библиотеки то как раз проблем нет - она дадена. Только конечно некоторые простые функции придется ещё дописать. И самое что меня больше всего в ней беспокоит, это следующие вопросы

1) выдает ли она когда нибудь -0 в качестве результата (ноль с выставленным байтом знака)

2) как она пережевывает этот -0 в качестве входящего параметра

3) как она пережевывает +- бесконечность в качестве входящего параметра для арифметических операций и что выдает

4) как переводит в целое число если оно не вмещается в подготовленные для него 3 байта

Ну и ещё некоторые вопросы. Часть из них можно проверить, но есть ли гарантия что поведение при проверке будет аналогичное всегда при любых случаях? :rolleyes:

 

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

 

ЗЫ ну и конечно если библиотека работает в своем формате, это потребует перевода всех входных и выходных параметров из IEEE и обратно - а это должно быть оправдано только существенной прибавкой скорости выполнения операций в ней, иначе как-то необоснованно получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм. хотя они вроде сразу нормальный Си предлагали, наверное тогда да, никто на ассемблере и не извращался в AVR.

Это Вы всю пьесу пропустили, видимо. И увидели только занавес.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...