Деление на 100 с сдвигом регистра

Тема в разделе "Микроконтроллеры AVR", создана пользователем Yerabdi, 8 апр 2024.

  1. Yerabdi

    Yerabdi Гик

    Приветствую всех вот есть задача как можно реализовать вместо деление на 100 с сдвигом регистра
    Заранее спасибо
     
  2. Asper Daffy

    Asper Daffy Иксперд

    1. Деление чего? float? 8-бит целого? 16-бит целого? 32- или 64-бит целого?
    2. А получить-то что надо? Частое? Остаток? То и другое?
    3. На каком процессоре?
    4. Для чего?
     
  3. Yerabdi

    Yerabdi Гик

    проц atmel64
    остаток не нужен
     
  4. parovoZZ

    parovoZZ Гуру

    это что за зверь?
     
  5. Asper Daffy

    Asper Daffy Иксперд

    Я такого не знаю :(
     
  6. Asper Daffy

    Asper Daffy Иксперд

    И да, я пока не увидел ответов на вопросы №1 и №4. Что именно делить и для чего. Клещами тянуть?
     
  7. Yerabdi

    Yerabdi Гик

    atmega64
     
  8. Yerabdi

    Yerabdi Гик

    извиняюсь не заметил целое uint32
    atmega64
     
  9. Yerabdi

    Yerabdi Гик

    a=(b*c)/100
    b=753 //значение постоянно меняется
    c=111 //значение постоянно меняется
    частота всего лишь 16МГц деление занимает много времени подумал что с сдвигом быстрее будет
     
  10. parovoZZ

    parovoZZ Гуру

    оставь эту затею. Переписать библиотеку от мэтров у тебя не получится.
    Ну или менять МК на тот, где есть аппаратный умножитель.
     
  11. Asper Daffy

    Asper Daffy Иксперд

    У atmega64 "умножитель" есть. Там "делителя" нету.
     
  12. Asper Daffy

    Asper Daffy Иксперд

    Ну, для такого большого числа, я не думаю, что удастся сколхозить что-то более эффективное, чем умножение на инвариант (которое использует GCC). Если бы поменьше, то может и был бы какой-то шанс оказаться быстрее. Тем более, что на 64-ой есть аппаратное умножение.

    Там за этим "умножением на инвариант" неплохая математическая база стоит. Можете вот здесь посмотреть. Только не начинайте сразу с раздела 9 "деление на константу" (Ваш случай). Чтобы его понять, надо читать с начала.
     
  13. parovoZZ

    parovoZZ Гуру

    Вообще, если ты результат выкидываешь в цомпкутер, то там и дели.
    Если выводишь на дисплей, то назначай точку на этапе операции перевода в BCD.

    смотрю в даташит и в упор не вижу(((
     
  14. Asper Daffy

    Asper Daffy Иксперд

    В этом я виноват? Или мировой империализм?

    Даташит, стр. 375

    upload_2024-4-8_12-3-6.png
     
    DetSimen, b707 и Yerabdi нравится это.
  15. parovoZZ

    parovoZZ Гуру

    а умножение на 0.01 не проканает?
     
  16. Yerabdi

    Yerabdi Гик

    Все получилось спасибо большое
    если кому то пригодится
    a=(b*c)/100 занимает ~40-45 мкс
    а=((b*c)*655)>>16; занимает ~ 8-9мкс
     
    b707 нравится это.
  17. b707

    b707 Гуру

    интересно... я думал в наше время нет смысла заменять деление сдвигом... оптимизатор давно сам такие места "расшивает"
     
  18. parovoZZ

    parovoZZ Гуру

    даёт ошибку в третьем знаке после запятой.
     
  19. Yerabdi

    Yerabdi Гик

    не знаю мне формулу ребята с киберфорума дали
     
  20. b707

    b707 Гуру

    опа... я уж подумал вы начали соображать...
    а сами вы не понимаете что-такое 655 >> 16 ??
    Возьмите калькулятор и посчитайте...
     
    parovoZZ нравится это.