【发布时间】:2012-05-06 12:43:27
【问题描述】:
我正在尝试诊断和修复一个错误,该错误归结为 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() 函数here。它计算多边形的质心,但是当多边形很小时,质心会在该位置周围不规则地跳跃,并且最终可能与多边形相距很远。上面的数据系列是多边形的一个节点沿一致的方向移动的结果(用手,这就是为什么它不是完全平滑的)。
这是 Adobe Flex 4.5。
【问题讨论】:
-
乘以 1000,除以结果除以 1000 时发生了什么?
-
好吧,没什么好 :) 在当前的一个化身中,我最终得到了一个只有两位精度的商。在这一点上,感觉就像我真的在通过反复试验进行编码,因此我的目标是接受一些关于正确做事方式的教育。
-
另外 - 你会乘分子还是分母?我猜是后者?
标签: actionscript-3 floating-point double division floating-accuracy