Изучал исходники с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
Очень большая потеря точности. Где столько потеряли?
Выяснил где, -- Редактирование изображения в векторном редакторе -- сочетание поворотов привязок систем координат и т.п.
На "математических методах" нас учили, что сравнение чисел с плавающей точкой некорректно, потому что по сути операций бывает потеря точности. При вводе данные следует округлять... при анализе следует применять ошибку, точность с которой мы хотим сравнивать числа. Ну и наконец тезис дня: складывать и вычитать надо числа одного порядка, а это уже магия, как расставить скобки. Чтобы было проще жить... вспоминается тезис из "мат физики", мат физика нам заменяла собой методы анализа непрерывных систем, и устойчивость систем. Сначала надо преобразовать систему координат, масштабировать с тем, чтобы все преобразования производились в масштабе "единица". Причем, к единице нужно привести все координаты и все физические величины (скорости и ускорнения) - это и есть залог того что точность не будет стремительно теряться из-за сложения бесконечно-больших величин с бесконечно-малыми.
К сожалению, сколько бы нас не учили когда-то - это все равно магия. Мало кто помнит и мало кто применяет.
1) if (x == 0.) { выдать ошибку деления на ноль. } else {выполнить деление на х}
Прокомментирую со всех сторон.
Бывают числа -0.f Бывают маленькие числа, от которых случается бесконечность при делении.
При повороте матрицы и при смещении регулярно вылезают числа вида -0.
2) if (x == 1.) { упростить выражение } else {выполнить сложную операцию}
Знатокам вопрос: почему ветвь "упростить выражение" никогда не выполняется при том, что числа x=1 всегда?
написал так printf("# %1.20f\n", x); Получил ответ:
# 0,99999996644295408021
А такие попадаются нули:
# 0,00000005315326100000
Очень большая потеря точности. Где столько потеряли?
Выяснил где, -- Редактирование изображения в векторном редакторе -- сочетание поворотов привязок систем координат и т.п.
На "математических методах" нас учили, что сравнение чисел с плавающей точкой некорректно, потому что по сути операций бывает потеря точности. При вводе данные следует округлять... при анализе следует применять ошибку, точность с которой мы хотим сравнивать числа. Ну и наконец тезис дня: складывать и вычитать надо числа одного порядка, а это уже магия, как расставить скобки. Чтобы было проще жить... вспоминается тезис из "мат физики", мат физика нам заменяла собой методы анализа непрерывных систем, и устойчивость систем. Сначала надо преобразовать систему координат, масштабировать с тем, чтобы все преобразования производились в масштабе "единица". Причем, к единице нужно привести все координаты и все физические величины (скорости и ускорнения) - это и есть залог того что точность не будет стремительно теряться из-за сложения бесконечно-больших величин с бесконечно-малыми.
К сожалению, сколько бы нас не учили когда-то - это все равно магия. Мало кто помнит и мало кто применяет.
Комментариев нет:
Отправить комментарий