2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Точность в вычислениях с фиксированной точкой
Сообщение08.08.2025, 18:11 
Допустим, мне нужно выполнить такую операцию: $A^2+A$ с фиксированной точкой. При этом $A$ у нас 16-битное. Результат тоже должен быть 16-битным. Приведение результата к 16 битам предлагается сделать путём взятия старших 16 бит.
Если точка стоит справа от LSB (то есть если по сути нет дробной части), то прибавление $A$ к $A^2$ на результат практически не влияет.
Если стоит посередине числа (т.е. мы отводим 8 бит под дробную часть), то прибавление 8 старших бит $A$ повлияют на результат нашего выражения.
Ну и так дальше. Чем больше дробная часть, тем при таком методе приведения $A^2+A$ к 16 битам прибавление $A$ больше влияет на результат.

То есть получается, что если у меня есть какие-то абстрактные числа, для которых нужно считать степень, то лучше сдвигать точку левее? Просто по сути операция одна и та же, точка эта вообще выдуманная, а результат меняется очень ощутимо - голова ломается. Данные, которые планируется возводить в степень - отсчёты АЦП.

 
 
 
 Re: Точность в вычислениях с фиксированной точкой
Сообщение08.08.2025, 18:27 
Такое впечатление, что сам результат (его точность) вам не важен
Ну так если записать $a^2+a=a(a+1)$ то и видно, что у вас операция возведения в квадрат "перекрывает" сложение. Действительно, $1000^2+1000=1001000$ неслишком-то отличается от $1000000$ (на десятую долю процента).

 
 
 
 Re: Точность в вычислениях с фиксированной точкой
Сообщение08.08.2025, 18:37 
wrest
Точность мне важна - я как раз хочу понять, как сделать вычисления с фиксированной точкой и при этом с максимальной точностью. Просто в первом приведённом мной примере прибавление $A$ на результат вообще не влияет, во втором - ощутимо влияет. Вот и возникает вопрос - почему и как тогда выбирать положение точки. На данный момент у меня ощущение, что чем точка левее, тем лучше...

 
 
 
 Re: Точность в вычислениях с фиксированной точкой
Сообщение08.08.2025, 19:45 
Аватара пользователя
Не понимаю вопроса.

Функция $F(A)=A^2 +A$ переводит в общем случае без потери точности 16-битное число в 32-битное.
Если $A$ может быть любое, то при переводе результата в 16-битное число с фиксированной точкой:
а) либо для больших $A$ будет возникать переполнение, и ошибка на порядки.
б) либо для малых $A$ будет ноль.

Вот и выбирайте.

 
 
 
 Re: Точность в вычислениях с фиксированной точкой
Сообщение08.08.2025, 22:40 
Аватара пользователя
Kevsh в сообщении #1696828 писал(а):
Приведение результата к 16 битам предлагается сделать путём взятия старших 16 бит.

Какое-то странное предложение, неестественное. Оттого и такие странные результаты получаются.
Результат обычно хотят представить в том же формате, что и исходные операнды. Ну, чтобы он там мог в дальнейших операциях поучаствовать.

 
 
 
 Re: Точность в вычислениях с фиксированной точкой
Сообщение10.08.2025, 14:38 
EUgeneUS
Вопрос вот в чём:
Допустим, у меня АЦП 4-битный, MSB отводится на знак. Я решил его отсчёты обработать с фиксированной точкой функцией $f(x)=x^2+x$. У меня попался отсчёт 0'111 (тут апостроф - отделение знакового бита). Если я говорю, что точка у меня в самом конце и дробной части у меня нет, то получаю ответ: 0'0111000, то есть 56 в десятичной сс. Если я выделяю под дробную часть 2 бита, то ответ уже такой: 0'100.1101, то есть 4.8125. В обоих случаях у меня переполнение, у меня тут два варианта:
1) Изначально уменьшить сигнал так, чтобы результат операции влез в разрядную сетку. Но так я очень сильно потеряю в точности, потому что по сути не буду использовать половину разрядов АЦП.
2) Преобразовать сигнал после вычислений так, чтобы результат влез в разрядную сетку в том же формате, что и до операции (то есть положение точки должно остаться прежним). Причём преобразовывать сигнал в самом конце не вариант, потому что тогда при вычислении функции $x^3+x^2+x$ нужно будет увеличивать разрядную сетку не в два, а уже в три раза и так далее. То есть принцип такой: сделали вычисление, вернули его в нужную разрядную сетку, перешли к следующему вычислению. Я выбрал именно этот вариант.

Получается, что в первом случае мы можем даже не выполнять сложение - всё равно оно будет за разрядной сеткой. Возводим 0'111 в квадрат, отсекаем последние 4 разряда и получаем 0'011, погрешность получилась около 14%.

Теперь рассмотрим второй вариант. Возводим в квадрат, двигаем точку и получаем 0'0.11. Точку мы сдвинули влево на 2 бита (поделили на 4), значит и слагаемого должны сделать то же самое. Прибавляем 0'0.01 (сдвинутое влево на два бита 0'1.11) и получаем 0'1.00 и погрешность около 20%.

Теперь вопрос - а какой вариант использовать? И если использовать вариант с точкой, то где её ставить? Есть ли какое-то правило на этот счёт или это определяется экспериментально? Допустим, нужно мне вычислить функцию $y = x + x^2 + x^3 + x^4$, это получается, что $ x + x^2 + x^3$ можно и не вычислять даже?

 
 
 
 Re: Точность в вычислениях с фиксированной точкой
Сообщение10.08.2025, 22:23 
Я посмотрел ещё в интернете... ничего на эту тему не нашёл. Везде умножение делают так: сначала перемножают, потом результат сдвигают вправо на количество цифр после запятой, которое было изначально. Например, $0'010.0101 \cdot 0'001.1011 = 0'011.11100111 >> 4 = 0'011.1110$. То есть все вычисления ведутся из расчёта, что для наших чисел есть аналоги с плавающей точкой, которые мы по какой-то причине переводим в фиксированную точку и так дальше обрабатываем. Но нигде не говорится, что делать с данными, которые изначально целочисленные, как те же отсчёты АЦП... где ставить точку?

 
 
 
 Re: Точность в вычислениях с фиксированной точкой
Сообщение11.08.2025, 00:48 
Kevsh
1) Перепроверим Ваши вычисления.
Kevsh в сообщении #1697028 писал(а):
отсекаем последние 4 разряда и получаем 0'011, погрешность получилась около 14%
14% Вы получили здесь таким образом: $ \frac {111000_2-110000_2} {111000_2} = \frac {56-48} {56} \simeq 14.29\% $

Kevsh в сообщении #1697028 писал(а):
и получаем 0'1.00 и погрешность около 20%
А как у Вас здесь получилось 20% не понятно? $ \frac {100.1101_2-100.0000_2} {100.1101_2} = \frac {4.8125-4} {4.8125} \simeq 16.88\% $

Учитывая, что здесь значительное отбрасывание (округление), разница в пару процентов ни о чём. Нет здесь разницы. Оба метода выглядят одинаковыми. Ваши примеры выглядят не убедительно.

2)
Kevsh в сообщении #1697085 писал(а):
Например, $0'010.0101 \cdot 0'001.1011 = 0'011.11100111 >> 4 = 0'011.1110$. То есть все вычисления ведутся из расчёта, что для наших чисел есть аналоги с плавающей точкой,

Где Вы здесь вообще увидели плавающую точку? Где здесь экспоненциальная форма представления чисел? Её здесь нет. Какое-то неправильное употребление терминов.
На всякий случай: число с плавающей точкой

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group