nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Хорошая штука байпас!

Сейчас смотрю, как работает нахождение обратной величины по методу Ньютона в своём QuatCore, по формуле


Раньше я предполагал, что результат вычисления скобки будет округлён до 16 бит (поскольку шина данных у нас 16-битная) и в таком виде пойдёт дальше. Чтобы оно работало максимально хорошо, предлагалась константа "2", в которую войдёт ещё половинка младшего разряда, так что отбрасывание младших бит будет эквивалентно округлению "до ближайшего целого".

Тогда я сказал, немного не подумавши, что 4 итераций хватит, чтобы получить 16 точных бит, если входное число в диапазоне от 16384 до 32768.

Но это мне повезло тогда - на конкретных примерах действительно ответ сошёлся до бита. Сейчас решил проверить основательно - нет, ошибки в последнем бите встречаются, примерно в 3 с половиной тысячах случаев из 16384 возможных, причём дальнейшие итерации не улучшают ситуацию.

NoBypassIsBad.png

Проблема именно в накоплении ошибок промежуточных вычислений.

А вот если результат вычисления скобки поступает в следующую операцию целиком - ошибка сразу же уходит, 4 итераций действительно хватает, чтобы получить 16 точных бит!

Правда, начальное значение надо взять обязательно в интервале от 43513 до 43763, иначе ошибки всё-таки останутся на краях интервала. И 4 итерации действительно необходимы. На трёх итерациях можно добиться максимальной ошибки не более 10, и среднеквадратичного значения 1,88, точнее уже не выходит.


Теперь бы только сообразить, что делать со значением 65536 - оно в 16 бит не влезает, там на самом деле будет ноль.
Либо мы всё-таки не делаем совсем корректного округления числа на входе, тогда там никогда не возникнет 16384, только 16385..32768, и результат нахождения обратной величины замечательно влезет в 32768..65532. Либо делаем округление, а затем отдельно рассматриваем вариант с 65536, и корректируем его.


UPD. И ещё внезапно дошло, что как таковая "двойка" нам и не нужна здесь, можно поставить НОЛЬ - и ничего в работе не изменится! Точнее, изменится флаг переполнения на противоположный, а больше ничего, т.к "разряд двоек" у нас в конечный результат всё равно не попадает!
Tags: ПЛИС, математика, работа, странные девайсы
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 4 comments