Вопрос к программистам. Была, помнится, такая проблема.
Делали ПО, управляющее плоттером. Язык управления плоттером такой – последовательность 36-битовых команд. Одна команда содержит информацию о:
А) номере пера (одно из трех перьев) – двоичное целое 2 бита;
Б) положении пера (поднято/опущено) – двоичное целое 1 бит;
В) знаке приращения X (+/-) двоичное целое 1 бит;
Г) приращении по координате X (сколько шагов) – двоичное целое 15 бит;
Д) знаке приращения Y (+/-) двоичное целое 1 бит;
Е) приращении по координате Y (сколько шагов) – двоичное целое 15 бит.
Шаг – это минимальное расстояние, на которое может переместиться пишущий узел плоттера. Для нашего плоттера шаг составлял 0,05мм (1/20мм).
Подпрограмма, формирующая команды получала параметры (собственно приращения) в переменных формата dec float. Приращения (пункты Г и Е) получались умножением приращений на 20, округлением и переводом в двоичный формат – fix bin.
Произведенные затем испытания плоттера обнаружили проблему: когда нужно было выполнить множество N повторяющихся одинаковых перемещений перо плоттера по завершении вычерчивания этих одинаковых перемещений переходило в точку, отличную от расчетной. Ошибка накапливалась. Поразмыслив над проблемой, мы догадались, что дело в округлении. Мы после умножения на 20 просто прибавляли 0,5 и отбрасывали дробную часть. В самом худшем случае, отбрасываемая при округлении часть параметра составляла чуть меньше или чуть больше 0,5. Сто таких перемещений давали ошибку 0,5*100/20=2,5мм. Тысяча – 25мм.
Вопрос. Как бы вы в решили эту проблему?
По очереди округлять то вверх, то вниз - статистически ошибка минимизируется.
В идеале изначально путь привязать к сетке плоттера и приращения рассчитывать уже на сетке.