Я пытаюсь диагностировать и исправить ошибку, которая сводится к тому, что X/Y дает нестабильный результат, когда X и Y малы:
В этом случае и cx, и patharea плавно увеличиваются. Их отношение представляет собой гладкую асимптоту при больших числах, но неустойчивую для «маленьких» чисел. Очевидная первая мысль состоит в том, что мы достигаем предела точности с плавающей запятой, но сами числа далеки от него. Типы ActionScript «Числа» представляют собой числа с плавающей запятой двойной точности IEE 754, поэтому должны иметь точность 15 десятичных цифр (если я правильно понял).
Некоторые типичные значения знаменателя (patharea):
0.0000000002119123
0.0000000002137313
0.0000000002137313
0.0000000002155502
0.0000000002182787
0.0000000002200977
0.0000000002210072
И числитель (сх):
0.0000000922932995
0.0000000930474444
0.0000000930582124
0.0000000938123574
0.0000000950458711
0.0000000958000159
0.0000000962901528
0.0000000970442977
0.0000000977984426
Каждое из них монотонно возрастает, но соотношение, как видно выше, хаотично.
При больших числах она сводится к гладкой гиперболе.
Итак, мой вопрос: как правильно работать с очень маленькими числами, когда вам нужно разделить одно на другое?
Я думал заранее умножить числитель и/или знаменатель на 1000, но не смог.
Фактически рассматриваемый код — это функция recalculate()
здесь а>. Он вычисляет центроид многоугольника, но когда полигон крошечный, центроид беспорядочно прыгает вокруг места и может оказаться на большом расстоянии от многоугольника. Приведенные выше ряды данных являются результатом перемещения одного узла многоугольника в постоянном направлении (вручную, поэтому он не идеально гладкий).
Это Adobe Flex 4.5.