вторник, 20 февраля 2018 г.

SVG: типовые ошибки векторной графики

Изучал исходники сairographics нашел интересные места.



1) if (x == 0.) { выдать ошибку деления на ноль. } else {выполнить деление на х}
Прокомментирую со всех сторон.
Бывают числа -0.f Бывают маленькие числа, от которых случается бесконечность при делении.
При повороте матрицы и при смещении регулярно вылезают числа вида -0.

2) if (x == 1.) { упростить выражение } else {выполнить сложную операцию}
Знатокам вопрос: почему ветвь "упростить выражение" никогда не выполняется при том, что числа x=1 всегда?

написал так printf("# %1.20f\n", x); Получил ответ:

# 0,99999996644295408021
А такие попадаются нули:
# 0,00000005315326100000

Очень большая потеря точности. Где столько потеряли?
Выяснил где, -- Редактирование изображения в векторном редакторе -- сочетание поворотов привязок систем координат и т.п.

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

К сожалению, сколько бы нас не учили когда-то - это все равно магия. Мало кто помнит и мало кто применяет.

Комментариев нет:

Отправить комментарий