29.10.2010, 00:15
|
|
Временная регистрация
Регистрация: 25.11.2009
Сообщений: 61
Сказал спасибо: 1
Сказали Спасибо 17 раз(а) в 17 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от alexgap
|
OneTech, проверил ваш метод. К сожалению, он дает неверный результат даже для байта... Например, для 199 / 10 результат 20, что неверно, должно быть 19. А я было обрадовался новому методу оптимизации арифметических операций.
|
Просто после умножения надо прибавить корректирующий фактор. Как это всё вычислить, подробно расписано в книжке Hacker's Delight (русская версия "Алгоритмические трюки для программистов"). Алгоритм известен под названием "magic division", по этому термину можно найти кучу информации.
Последний раз редактировалось Falconist; 13.04.2011 в 23:09.
|
|
|
|
29.10.2010, 00:17
|
|
Вид на жительство
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Продолжение, вообщем вот в чём суть:
199 / 10 = 19,9
Для повышения точности будем не 256 / 10, а 65536 / 10 = 6553,6 ~= 6554
199 * 6554 = 1304246 или 0x13E6B6
Проанализуруем старший байт числа это 0x13 или 19 dec.
Конечно на этом можно и остановиться, но... если рассмотреть отбрасываемые 2 байта, то там можно увидеть число 0xE6B6 или 59062 dec
Теперь что-бы понять в какую сторону нужно скорректировать результат достаточно сравнить отбрасываемый остаток с 65536/2 или 32768, если это число 59062 больше или равно 32786 значит результат нужно скорректировать на +1, если меньше значит ничего не делать. Tеперь попробуйте с другими числами
__________________
Делая дело нужно в него верить на все 100%, иначе неизбежно будут возникать ошибки подпитывающие подсознательное сомнение.
Последний раз редактировалось OneTech; 29.10.2010 в 00:31.
|
|
|
Сказали "Спасибо" OneTech
|
|
|
29.10.2010, 00:19
|
|
Вид на жительство
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
roxfan опередил. Честно говоря уважаемый roxfan я до этого метода додумался сам, после того как придумал как обычное число перемножить на дробную константу не прибегая к float. Методика похожая.
__________________
Делая дело нужно в него верить на все 100%, иначе неизбежно будут возникать ошибки подпитывающие подсознательное сомнение.
Последний раз редактировалось OneTech; 29.10.2010 в 00:24.
|
|
|
|
29.10.2010, 00:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от OneTech
|
45 тактов, только появилась погрешность, результат деления не 100`000, а 100`021 это недостаток такого метода.
|
У метода вообще то этого недостатка нет. Замена идет 1 к 1.
А вот делитель я Вам дал самый неудобный. ![Улыбка](images/smilies/icon_smile.gif)
С ним смысла заменять деление умножением на 8-ми битнике нет. У меня вышло больше 1000 тактов.
Последний раз редактировалось Falconist; 13.04.2011 в 23:10.
|
|
|
|
29.10.2010, 00:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Последний раз редактировалось Falconist; 13.04.2011 в 23:11.
|
|
|
|
29.10.2010, 01:07
|
|
Вид на жительство
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
__________________
Делая дело нужно в него верить на все 100%, иначе неизбежно будут возникать ошибки подпитывающие подсознательное сомнение.
Последний раз редактировалось Falconist; 13.04.2011 в 23:10.
|
|
|
|
29.10.2010, 02:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от OneTech
|
Я свои 45 тактов получил на 8-ми битке, только корректирующий фактор не учитывал, а вообще это ещё + ~6 тактов, против 1000.
|
А попробуйте учесть. Особенно за 6 тактов.
Приведем цифры к единому знаменателю. Делимое 0-1000000 включительно, делитель 10. Это как бы уже прикладное применение имеет - как раз на индикатор что вывести например. Должно делиться точно для любого делимого из вышеприведенного диапазона. Вам кстати проще, число влезает в три байта, так что преимущество перед компилятором Си имеете - ему это не объяснишь.
У меня вышло ровно 75 тактов. Это с учетом загрузки делимого из памяти и выгрузки туда же результата. Так что тоже сделайте так же, чтоб одинаково было. Т.е. есть 4 ячейки ( у Вас может и три быть!), содержимое их надо поделить на 10 и туда же поместить.
Последний раз редактировалось Falconist; 13.04.2011 в 23:13.
|
|
|
|
29.10.2010, 05:35
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Народ заканчивайте оффтопить, давайте по делу.
|
|
|
Сказали "Спасибо" zheleznjakov
|
|
|
29.10.2010, 08:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от zheleznjakov
|
Народ заканчивайте оффтопить, давайте по делу.
|
Так похоже STM8 никому не интересны. Как тут выше - пройдет год другой, кто то другой все грабли найдет и на форумах выложит и вот тогда... ![Улыбка](images/smilies/icon_smile.gif)
Ну в завершении темы с делением - чтоб OneTech велосипед не изобретал закончу.
Выбираем степень двойки, чем больше, тем лучше. ![Улыбка](images/smilies/icon_smile.gif) Величина зависит от максимального делимого. Удобно выбирать 16,32. Назовем - S
Делим 2^S на наш делитель. Если дробная часть больше или равна 0.5 то округляем вверх и ничего больше не делаем. Если меньше 0.5, то округляем вниз и будем прибавлять единичку к делимому. После умножения сдвиг вправо на S. Если S была кратна 8 можно обойтись без сдвига. На 8-ми битниках метод имеет слабое применение, хотя для относительно небольших делимых все в шоколаде. А вот если 16 миллионов на три поделить, уже не так приятно.
А STM8 я мучить продолжу, сразу после починки компа.
Последний раз редактировалось Falconist; 13.04.2011 в 23:13.
|
|
|
|
29.10.2010, 09:14
|
|
Временная регистрация
Регистрация: 24.09.2010
Сообщений: 97
Сказал спасибо: 9
Сказали Спасибо 41 раз(а) в 31 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
Так похоже STM8 никому не интересны. Как тут выше - пройдет год другой, кто то другой все грабли найдет и на форумах выложит и вот тогда... ![Улыбка](images/smilies/icon_smile.gif)
А STM8 я мучить продолжу, сразу после починки компа.
|
Очень даже интересны, только пока спрашивать не о чем...
Камни и отладчик в пути, платы в производстве...
Как замена AVR очень даже актуально в свете новых цен на них.
Последний раз редактировалось Falconist; 13.04.2011 в 23:13.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:09.
|
|