当前位置: 首页 > 知识库问答 >
问题:

如何判断一个二维双精度浮点对的集合是否存在浮点舍入误差?

边明煦
2023-03-14

所以任意椭圆似乎比圆多两个自由度,因为除了圆的半径和圆心外,还有旋转角度,以及长轴与短轴之比的缩放(圆没有)。所以,我必须检查一下,但我相信,只有5个不同的点,才能唯一地定义一个通过这些点的椭圆,可能会受到点的一些限制,比如任何其他3个点的凸包中都没有点。不管怎样,假设一般情况下您需要一定数量的点来定义穿过它们的唯一椭圆(可能是4或5个点)。假设我们有更多的点数。如果我们处理的是IEEE浮点(例如64位),尾数中的舍入误差,如果点的假体中的舍入误差可以解释任何差异,那么确定点是否位于公共椭圆上的稳健方法是什么?理想情况下,我希望避免使用扩展的精确算术来得到答案,但如果需要这样做,那么就这样吧,只要它的使用和增加的运行时间可以最小化。

共有1个答案

汪博艺
2023-03-14

这是一项非常重要的任务,过去已经研究过无数的方法。题目叫做“椭圆拟合”或“稳健椭圆拟合”。在第二种情况下,您期望有一部分点在椭圆上不对齐(它们被称为离群点),您不希望它们影响拟合。

对于第一种方法,我建议您使用RANSAC方法:

>

  • 随机选择五个点;这确实是定义椭圆所需要的

    a x² + b xy + c y² + d x + e y + f = 0.
    
    • 则拟合优度由剩余点到椭圆的距离之和(或最大值)给出。

    椭圆的欧几里得距离是一个不容易的问题,因为它涉及到一个四次方程。将点坐标插在隐式方程的LHS中,绝对值除以梯度的范数,得到了合理的近似。

    >

  • 用几个点集重复这个过程,并保持最小的全局残差,这就是您的稳健拟合。

    现在可以查看单个残留物。

  •  类似资料:
    • 假设我使用一个32位的浮点数来存储一个位串(不要问)。进一步假设我想将这个浮点数序列化为一个文件(作为一个浮点数),并在序列化之前对浮点数的十进制表示进行银行家四舍五入。当我将浮点数读回程序时,系统会(自然地)将其存储在一个32位的浮点数中,该浮点数尽可能接近序列化的数字。 在银行舍入后,我的序列化浮点数在数字上必须有多精确,才能确保序列化的浮点数在二进制上与读回的浮点数相等?

    • C和C++提供了几种宽度的浮点数据类型,但它们没有指定精度。编译器可以自由地使用理想化的算术来简化表达式,使用双精度来计算值上的表达式,或者使用双精度寄存器来保留变量或公共子表达式的值。 纠正我如果我是错的是错的,请参见编辑,但是将内存中的提升到双精度寄存器中也是合法的,所以存储一个值然后加载回来并不一定会截断位。 将一个数字转换成一个较低精度的最安全、最便携的方法是什么?理想情况下,在SSE2上

    • 我编写了一个程序来演示Go中的浮点错误: 它打印: 这与用C编写的相同程序的行为相匹配(使用双代码类型) 但是,如果改用,程序就会陷入无限循环!如果将C程序修改为使用而不是,它将打印 为什么在使用时,Go程序的输出与C程序的输出不一样?

    • 问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 这是简单的方法。请勿将regex用于内置类型。

    • 问题内容: 是否有比浮点精度更好的数据类型? 问题答案: 小数数据类型 与基于硬件的二进制浮点数不同,十进制模块具有用户可更改的精度(默认为28位),可以与给定问题所需的精度一样大。 如果您对性能问题感到困扰,请查看GMPY