Я пытаюсь диагностировать и исправить ошибку, которая сводится к тому, что 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
И числителя (cx):
0.0000000922932995
0.0000000930474444
0.0000000930582124
0.0000000938123574
0.0000000950458711
0.0000000958000159
0.0000000962901528
0.0000000970442977
0.0000000977984426
Каждое из них монотонно возрастает, но отношение хаотично, как видно выше.
При больших числах она сводится к гладкой гиперболе.
Итак, мой вопрос :как правильно поступить с очень маленькими числами, когда нужно разделить одно на другое?
Я думал заранее умножить числитель и/или знаменатель на 1000, но не смог.
Фактически рассматриваемый код — это recalculate()
функция здесь . Он вычисляет центроид многоугольника, но когда полигон крошечный, центроид беспорядочно прыгает вокруг места и может оказаться на большом расстоянии от многоугольника. Приведенный выше ряд данных является результатом перемещения одного узла многоугольника в постоянном направлении (вручную, поэтому он не идеально гладкий ).
Это Adobe Flex 4.5.