所以我的一个朋友正在为4个2-d浮点元组写一个假设的测试(比如IEEE 64位,我相信是这种情况),如果浮动是不可能的话,测试应报告“假”点四舍五入错误(在每个浮点上独立),使4个2-d点位于一个公共圆上,否则报告“可能/真”。他声称他通过将圆心设置为(0,0),然后选择随机全局半径,然后为每个2-d点选择均匀随机角度,并在圆上生成4个随机浮点对,并使用cos / sin得到每个点的x和y,并且通常他的测试报告“假”,即所产生的4个浮点对据说不能解释为在一个公共圆上,直到每个浮点数的独立舍入误差。
我朋友的代码是他公司的专有代码所以他不能与我分享,但它让我感到疑惑。如何确定由64位IEEE浮点数定义的4个2-d点是否可能位于公共圆上,假设每个浮点数都受到独立的有限精度舍入?我朋友的测试程序范例对这样的功能有效吗?或者他可能会生成他认为应该是“真/可能”的答案,但根据我给出的定义,其实际答案应该是“假的”?
答案 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
)。