我正在尝试诊断和修复一个错误,该错误归结为 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。