Я пытаюсь диагностировать и исправить ошибку, которая сводится к X/Y, что дает неустойчивый результат, когда X и Y малы:
В этом случае как cx, так и patharea плавно увеличиваются. Их отношение является гладкой асимптотой при больших числах, но неустойчивой для "малых" чисел. Очевидная первая мысль состоит в том, что мы достигаем предела точности с плавающей запятой, но сами фактические числа нигде не приближаются к ней. Типы ActionScript "Number" - это поплавки с двойной точностью 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()
функция здесь. Он вычисляет центр тяжести многоугольника, но когда многоугольник крошечный, центроид прыгает беспорядочно вокруг места и может оказаться на большом расстоянии от многоугольника. Ряд данных, приведенный выше, является результатом перемещения одного node многоугольника в последовательном направлении (вручную, поэтому он не идеально гладкий).
Это Adobe Flex 4.5.