nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Про старинные правила округления

Когда-то victor_chapaev упомянул про инженерные правила, по которым 200.32 округляется до 200, 9.321456 до 9.3, а 1.342567 до 1.34.

Это в целом логично, стоит хотя бы взглянуть на ряд E24 номиналов резисторов и конденсаторов. Вблизи единицы значения идут тучно:
1,0 1,1 1,2 1,3 1,5 1,6...
а в конце декады - куда как скромнее:
5,6 6,2 6,8 7,5 8,2 9,1

в итоге, точность повсюду получается порядка 5%.

Если взглянуть на примеры этих инженерных правил, мы получаем 0,25% в первом случае (0,5/200), 0,5% во втором и 0,37% в третьем, т.е одного порядка, при том, что для 9,3 хватило всего 2 значащих цифр.

Как это не удивительно, но в QuatCore мы введём нечто похожее, потому что так реализовать будет тупо проще :)




У нас в программе ровно одно "число с плавающей точкой" нужно будет показать - дальность до объекта. У нас отдельно лежит "экспонента", общая для всего вектора параллельного переноса. Она может принимать значения от 0 до 9. Ноль соответствует дальностям от 0,5 до 1 метра, девятка - от 256 до 512 метров.

И отдельно лежат три "мантиссы", для компонент X,Y,Z соответственно, причём по "продольной" оси X это число беззнаковое, которое должно принимать значение от 1 до 2-2-15 (т.е от 32768 до 65535), а по "поперечным" осям Y,Z - знаковые, от -1 до 1 (т.е от -32768 до 32767).

Такое представление кажется довольно удобным для работы - если уж мы увидели объект на фотоприёмной матрице, то задать его координаты мы точно сможем. Кроме того, у нас на фотоприёмной матрице в сущности "угловые" величины, и для работы с ними экспонента вообще не нужна, она из всех выражений сокращается! (один раз она нужна, чтобы правильно прибавить координаты точек мишени, а потом - всё).

И мне очень хочется выдавать дальность на экранчик непосредственно в метрах, но не шибко сложно.

Таблица выше позволяет это сделать "малой кровью" - в зависимости от экспоненты мы выбираем множитель, на который домножаем мантиссу. Получившееся число мы и выводим на экран, поставив десятичную запятую так, как указано в таблице.

Причём положение запятой мы можем в память не заносить отдельной таблицей, она находится по формуле:



такие скобки означают "округление вниз". Подобную формулу мы элементарно можем посчитать "на лету". Допустим, в регистре i лежит экспонента.

  Acc  18
  SUB  i
  DIV2 Acc
  DIV2 Acc

усё, теперь в аккумуляторе лежит положение десятичной точки.

В таком подходе есть "слабость" - у нас могут получаться числа от -65535 до +65535 (аккумулятор содержит дополнительный бит, чтобы не происходило переполнения во время вычислений), а нам хотелось бы иногда отображать от -99999 до +99999, с точкой, стоящей в соответствующей позиции.

Наиболее это заметно в графе, выделенной жёлтым - казалось бы, нам надо отобразить дальность от 4,0000 до 8,0000 метра, но поскольку мы не умеем показывать число 80000 (оно тупо не лезет в аккумулятор), то одним десятичным разрядом пожертвовали, обойдясь числами от 4000 до 8000.

Так вот, с достаточной увереностью мы можем заявить: это не баг а фича! Пятый разряд в этой ситуации действительно не шибко нужен, не получится у нас такой точности, чтобы его нужно было демонстрировать :) По ТЗ от нас вообще требуют точность в 5% на дальностях до 100 метров, либо в 5 метров на дальностях свыше 100 метров. Чтобы продемонстрировать выполнение ТЗ, хватило бы вообще 3 разрядов, а иногда и того меньше. Но я всё-таки ожидаю, что точность будет на порядок выше требуемой по ТЗ, и было бы глупо ею не похвалиться!
Tags: ПЛИС, математика, программки, работа, странные девайсы
Subscribe

Recent Posts from This Journal

  • Формулы приведения, что б их... (и atan на ТРЁХ умножениях)

    Формулу арктангенса на 4 умножениях ещё немножко оптимизировал с помощью алгоритма Ремеза: Ошибка уменьшилась с 4,9 до 4,65 угловой секунды, и…

  • Алгоритм Ремеза в экселе

    Вот и до него руки дошли, причина станет ясна в следующем посте. Изучать чужие библиотеки было лениво (в том же BOOSTе сам чёрт ногу сломит), писать…

  • atan на ЧЕТЫРЁХ умножениях

    Мишка такой человек — ему обязательно надо, чтоб от всего была польза. Когда у него бывают лишние деньги, он идёт в магазин и покупает какую-нибудь…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 2 comments