КРАМ писал(а):
Вы все никак не поймете, что НЕТ НИКАКОЙ ДРОБНОЙ ЧАСТИ при вычислении с фиксированной точкой. Это УСЛОВНОСТЬ.
Да здесь как раз всё понятно: 32-разрядный регистр, старшие 16 бит условно считаются целой частью, младшие 16 - это fractional part. В прикреплённом выше документе это разжевано, главное - не потерять двоичную точку при вычислениях, и там показаны все правила. С этой УСЛОВНОСТЬЮ всё же прийдётся считаться при вычислениях.
С этим как раз вопросов нет.
КРАМ писал(а):
Если Вам требуется разрешение/точность в 0,1 дБ, это означает, что выходная величина будет не 96, а 960.
Поэтому я и сказал про 10 итераций. По одной на каждый разряд двоичного представления числа 960.
Всё правильно - 963 (если точнее) вполне вписывается в 10 разрядов.
КРАМ писал(а):
Что касается формата 16.16, то я лишь прикинул, что удвоение разрядности исходного числа позволит получить требуемые 0,1 дБ. Все равно 16 разрядов не хватит, так что следующий шаг - 32 разряда.
Должно хватить. Нужно пробовать
У меня сейчас вопрос скорее алгоритмический. Как я понимаю, то нужно:
Инициализация:
С = 1;
n = 6;
взять из таблицы наибольшее значение, например, Cn = С6 = pow(10,0.05*2^6);
1) M = С*Сn
2) сравнить M с А
3) если А > M то установить 6-й бит (влево от условной двоичной точки) х в единицу, C = M
4) если A = M, то свершилось чудо и мы получили точное значение х=20lg(A). На этом закругляемся.
5) A < M, устанавливаем 6-й бит x в 0
6) n = n-1
7) если n >= -3 идём на пункт 1
Честно говоря, непривычно подбирать сомножители, да ещё из таблицы.
Цифры из таблицы понял
x = 10*20*lg(A)
A = pow(10,x/200)
Тогда младший разряд как раз и получается 10^(1/200) = 10^0.005, а старший 10^(1024/200) = 10^5.12.
Однако очень трудно переварить fixed point
