我想比较两个浮点数相对于已知绝对容差的相等性。然而,这是我很久以前写的一个算法,我相信如果等式关系不是传递的,那么该算法的逻辑就会被破坏。
一些假阴性是没有问题的,即如果两个“相等”的数字比较不相等,那么会发生的只是算法将使用更多的时间和内存。但是,我现在得到了由另一种算法预处理的输入数据(以平滑角落),但是该算法在每条直线上都添加了噪声,这导致我的算法过程中出现内存消耗问题(> 4GB)。
我基本上看到了两个选项,我该如何解决这个问题:
- 我可以尝试从预处理算法的结果中去除“噪音”。
- 我可以尝试找到一种以传递方式进行基于容差的相等比较的方法。
第一种方法对我来说看起来更容易。我基本上会有一组固定的双打,并且需要选择一组代表,以便该组中的每个双打都在代表的 epsilon 内。我对第二种方法的唯一想法是将值捕捉到网格以进行比较。但是,我依稀记得以前实现过这样的网格捕捉方法,但是一旦 (c++) 编译器开始内联相应的代码,它就崩溃了。我通过将捕捉代码移动到不同的翻译单元来解决此问题,但后来重写了代码以使捕捉过时。
问题
是否可以在不违反传递性的情况下进行基于容差的相等比较(在 C++ 中)?
什么是实现“去噪”算法的好方法?我的方法可能是保留一个排序的代表列表,并在该列表中通过二等分查找每个新的双精度值,从而导致运行时和“去噪”算法的(附加)内存消耗。