如何判断浮点数是否四舍五入,4个二维点可能位于一个公共圆上?

时间:2015-06-11 23:09:33

标签: algorithm floating-point

所以我的一个朋友正在为4个2-d浮点元组写一个假设的测试(比如IEEE 64位,我相信是这种情况),如果浮动是不可能的话,测试应报告“假”点四舍五入错误(在每个浮点上独立),使4个2-d点位于一个公共圆上,否则报告“可能/真”。他声称他通过将圆心设置为(0,0),然后选择随机全局半径,然后为每个2-d点选择均匀随机角度,并在圆上生成4个随机浮点对,并使用cos / sin得到每个点的x和y,并且通常他的测试报告“假”,即所产生的4个浮点对据说不能解释为在一个公共圆上,直到每个浮点数的独立舍入误差。

我朋友的代码是他公司的专有代码所以他不能与我分享,但它让我感到疑惑。如何确定由64位IEEE浮点数定义的4个2-d点是否可能位于公共圆上,假设每个浮点数都受到独立的有限精度舍入?我朋友的测试程序范例对这样的功能有效吗?或者他可能会生成他认为应该是“真/可能”的答案,但根据我给出的定义,其实际答案应该是“假的”?

1 个答案:

答案 0 :(得分:0)

挑战在于找到圆圈的中心。如果您认识到以下事实,这很简单。

在圆圈上画两个点。由于两个点必须距离中心一个半径,这意味着中心必须位于垂直于中点的直线上。

如果我给你分数(1, 1)(1,3),如果这些分数位于一个公共圆上,则该中心必须位于y=2行。

或者一般来说,如果我给你分数P1 = (x1, y1)P2 = (x2, y2),那么中点是P_mid = (x_mid, y_mid) = (0.5*(x1+x2), 0.5*(y1+y2))。两个给定点之间的线的斜率为m = (y2 - y1)/(x2 - x1),因此垂直线的斜率为m_perp = - (x2 - x1)/(y2 - y1)。因此,如果(x1, y1)(x2, y2)落在同一行,则中心必须落在的行的等式为y = m_perp ( x - x_mid) + y_mid

现在我们给了我们4分。每对点给我们一条交叉线。有六对点(P1, P2), (P1, P3), (P1, P4), (P2, P3), (P2, P4), (P3, P4)。每对点给我们一条中心必须落下的线。取这些线中的任意两条,你可以通过找到线相交的位置来解决中心P_center(你有两个方程和两个未知数)。现在只需计算从每个点到计算中心的距离,并确保所有这些距离都落在某个允许的浮点容差范围内(例如,对于64位浮点数,1e-14)。