Как правильно делить крошечные числа двойной точности без ошибок точности?

Я пытаюсь диагностировать и исправить ошибку, которая сводится к тому, что X/Y дает нестабильный результат, когда X и Y малы:

enter image description here

В этом случае увеличиваются как 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.

11
задан Steve Bennett 9 May 2012 в 08:37
поделиться