[an error occurred while processing this directive]
Именно так. Кроме того, там я механически ошибся - не оттуда copy/paste сделал, см. внутри
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено =AVR= 06 июня 2006 г. 21:28
В ответ на: Не совсем понял Вашу арифметику. В Вашем примере x*64723 > 65536. отправлено vanessa 06 июня 2006 г. 20:13

Там должно быть вот так:

x*0.9876 = x*9876/10000 ~~ x*64723/65536 = (x*64723) >> 16 или просто x=LSW(x*64723)

Разумеется, int*int=long, т.е. 32 бита, но в подавляющем большинстве случаев удается обойтись старшей половиной этого лонга, которая опять int. В ряде случаев можно даже обойтись только int - например, имеем 10-битный АЦП, хотим смасштабировать его результат (0..1023) в 0..799. Считаем - 799/1023=0.976539589. Это приблизительно равно 51186\65536, но при некоторой потере точности можно взять такой числитель, что результат умножения не превысит 2^16. Для этого ставим в знаменатель 64, и получаем k = 50/64. Проверяем: 1023*50=51150 (значение АЦП максимально, но из int мы не вылезли), 51150\64 = 51150 >> 6 = 799, что нам и требовалось.

Максимальная ошибка в этом случае составит 1023*(50\64)-1023*(51186/65536)=799.219-799.000=0.219, то есть меньше половины младшего разряда АЦП. Но, повторяю - такой номер не всегда пройдет, все будет зависеть от "удобства" масштабного коэффициента. В общем же случае потребуется всего один промежуточный long, и точность будет очень хорошая. Общая идея такого подхода - постараться обойтись без операций деления, заменяя их на "двоичное деление", то есть на сдвиг числа на N бит вправо в качестве деления на 2^N. Когда N кратно 4,8,16,24 или 32, то и эта операция упрощается и ускоряется, т.к. может быть заменена на соответствующую перестановку полубайт/байт/слов в результате. Разумеется, такой подход позволяет в подавляющем большинстве случаев обойтись без применения громоздких и медлительных вычислений с плавучкой

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru