Как вычислить в МК логарифм по основанию 2, от числа в диапазоне 1,000,,,,2,000? С точностью до одного знака после запятой?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
Отправлено
=NIK=
17 июня 2005 г. 13:44
Составить ответ
|||
Конференция
|||
Архив
Ответы
А что, стандартная функция не проходит?
—
Bill
(17.06.2005 13:53
193.233.81.98
,
пустое
)
Что за стандартная функция?
—
=NIK=
(17.06.2005 13:58
80.72.116.22
,
пустое
)
Хм... Обычная, log(x). Имеется в библиотеке. Прототип - в math.h
—
Bill
(17.06.2005 14:03
193.233.81.98
,
пустое
)
Только вот она с плавающей точкой работает... А log для чисел с фиксированной точкой в С-либах к великому сожалению отсутствует.
—
SM
(17.06.2005 14:16
213.141.159.26
,
пустое
)
Само собой.
—
Bill
(17.06.2005 14:23
193.233.81.98
,
пустое
)
И это "само собой" обычно как серпом по яйцам в применении С к embedded... Плавучка все таки в таких делах (+)
—
SM
(17.06.2005 14:27
213.141.159.26
, 85 байт)
Тем не менее, иногда приходится использовать.
—
Bill
(17.06.2005 14:32
193.233.81.98
,
пустое
)
Согласен, бывает (+)
—
SM
(17.06.2005 14:38
213.141.159.26
, 381 байт)
Да, в нашем первом проекте мы использовали дробные числа с фиксированной точкой.
—
Bill
(17.06.2005 14:49
193.233.81.98
, 208 байт)
И это обычно наиболее эффективное решение. (+)
—
SM
(17.06.2005 14:53
213.141.159.26
, 331 байт)
Переполнения бывают при умножении целых чисел. Для дробных чисел
—
Bill
(17.06.2005 15:00
193.233.81.98
, 200 байт)
Что есть масштабирование, как не плавающая точка? :-)
—
Vladimir Ljaschko
(17.06.2005 18:35
80.144.181.167
,
пустое
)
Формат чисел с плавающей точкой дает возможность АВТОМАТИЧЕСКОГО масштабирования в процессе вычислений.
—
Bill
(17.06.2005 21:50
195.239.108.7
, 547 байт)
Это не более чем домножение на константу, частный случай которого сдвиг влево или вправо. Экспоненту НЕ ХРАНИМ. Точка фиксированная.
—
SM
(17.06.2005 19:43
213.141.159.26
,
пустое
)
Что-то я Вас не понимаю (+)
—
SM
(17.06.2005 16:54
195.225.131.183
, 330 байт)
Точка фиксирована после знакового (старшего) разряда. И, кстати, для умножения
—
Bill
(17.06.2005 21:39
195.239.108.7
, 193 байт)
Тьфу, не ДД, а С/Ш конечно
—
SM
(17.06.2005 14:38
213.141.159.26
,
пустое
)
Я на асме пишу. Там нечего похожего не видел :(
—
=NIK=
(17.06.2005 14:05
80.72.116.68
,
пустое
)
И в AVR Studio еще? Я думал на Си :(
—
Bill
(17.06.2005 14:14
193.233.81.98
,
пустое
)
Си к сожалению не знаю :(
—
=NIK=
(17.06.2005 14:21
80.72.115.14
,
пустое
)
Линейной интерполяцией по таблице
—
-mse-
(17.06.2005 13:47
81.201.65.235
,
пустое
)
Я пробовал сделать апроксимацию прямыми линиями, и делать расчет на разных интервалах по разным линиям, но что-то громоздко получается :(
—
=NIK=
(17.06.2005 14:06
80.72.116.68
,
пустое
)
нах? Интервалы должны быть одинаковыми. Кол-во кратно степени 2, так избавишься от деления.
—
-mse-
(17.06.2005 14:23
81.201.65.235
,
пустое
)
Как и от разных линий :) Это получится аккурат то, что я описал.
—
SM
(17.06.2005 14:28
213.141.159.26
,
пустое
)
Кстати, на первый взгляд...
—
-mse-
(17.06.2005 15:24
81.201.65.235
, 110 байт)
Ага, именно линейной она получается. Но во многих случаях (+)
—
SM
(17.06.2005 16:55
195.225.131.183
, 119 байт)
Ну, для уха, оно, конечно. А вот для глаза, типа, калькулятора, плохо. ;О)
—
-mse-
(17.06.2005 17:07
81.201.65.235
, 85 байт)
Дык штука-то в том, что (+)
—
SM
(17.06.2005 19:44
213.141.159.26
, 125 байт)
Да это-то понятно, только погрешность... Смотреть на "-35,5дБ±1(2...)дБ", например, не по-пацански ;О)
—
mse
(17.06.2005 23:19
213.132.70.166
,
пустое
)
Только сначала экспоненту, которая есть (+)
—
SM
(17.06.2005 13:48
213.141.159.26
, 73 байт)
ну чловек же пишет 1,000-2,000, значит всё, экспонента выжата. ;О)
—
-mse-
(17.06.2005 14:06
81.201.65.235
,
пустое
)
Неа, 1000 это меньше 1024 :) А 2000 больше. Значит там один бит имеецца.
—
SM
(17.06.2005 14:11
213.141.159.26
,
пустое
)
Ну, меня в школе учили, что 1,000-2,000 это, типа, от "1" до "2". Причём уже в плывучке. ;О) Мож мужык чего другое имел в виду? Ну, дык, каков вопрос - таков ответ.
—
-mse-
(17.06.2005 14:28
81.201.65.235
,
пустое
)
Ай. Запятую я просто воспринимаю как разделитель разрядов, а не десятичную '.' :)
—
SM
(17.06.2005 14:29
213.141.159.26
,
пустое
)
Я имел ввиду что 1,000-2,000 это в десятичном виде т.е. выходные данные будут в диапазоне от 0,0-1,0. Ну если входные данные будут домноженны на 100 и точность убавить, то хватит 8 бит. Т.е. входные данные от 100(в десятичном 1,00)-200 (в десятичном 2,00)
—
=NIK=
(17.06.2005 14:45
80.72.114.189
,
пустое
)
тогда уж на 128 домножайте, и никакой экспоненты не понадобится.
—
SM
(17.06.2005 14:47
213.141.159.26
,
пустое
)
Ну а так как (+)
—
SM
(17.06.2005 14:50
213.141.159.26
, 247 байт)
Спасибо, попробую
—
=NIK=
(17.06.2005 14:55
80.72.115.200
,
пустое
)
Прошу прощения за тупость. И как тогда будет выглядеть алгоритм?
—
=NIK=
(17.06.2005 14:48
80.72.114.189
,
пустое
)
Причем на вскидку вполне достаточно (+)
—
SM
(17.06.2005 13:50
213.141.159.26
, 123 байт)
К сожалению в математике я не силен :( Надо было учить матчасть! Где можно почитать про этот медод? Чтобы на одном языке с вами разговаривать. Можно ли без чисел с плавующей запятой обойтись?
—
=NIK=
(17.06.2005 13:56
80.72.116.22
,
пустое
)
А я и не говорю про числа с плавающей точкой, как и про дебри математики (+)
—
SM
(17.06.2005 14:10
213.141.159.26
, 890 байт)
Только ашипся немного (+)
—
SM
(17.06.2005 14:15
213.141.159.26
, 106 байт)
Спасибо. Попробую поэкспериментировать.
—
=NIK=
(17.06.2005 14:23
80.72.115.14
,
пустое
)
Хм. Если, конечно, целочисленное значение на входе.
—
SM
(17.06.2005 13:49
213.141.159.26
,
пустое
)
Перейти к списку ответов
|||
Конференция
|||
Архив
|||
Главная страница
|||
Содержание
|||
Без кадра
E-mail:
info@telesys.ru