是否有一个浮点数的标准类,它以忽略“小数字错误”的方式实现 <、== 和 >(之前必须指定小的)?
我知道我可以自己实现类似的东西,但也许我不必重新发明它。
是否有一个浮点数的标准类,它以忽略“小数字错误”的方式实现 <、== 和 >(之前必须指定小的)?
我知道我可以自己实现类似的东西,但也许我不必重新发明它。
在MathNET.Numerics库中有一个静态Precision类,它提供了许多请求的功能。没有运算符重载,但也许可用的方法仍然可以证明是足够的。
没有广泛使用的类或库,因为它是一种糟糕的编程技术,而且,就它提供的任何好处而言,它不容易适应不同的情况。
接受不相等的数字为相等会减少假阴性(由于浮点运算中的舍入而不被接受为相等的结果,但如果精确计算会相等)但会增加假阳性(被接受为相等但不相等的结果,如果精确计算)。没有一般原则可以平衡假阴性的减少与假阳性的增加,反之亦然,因此对于这个问题没有一般的解决方案。
此外,还会出现许多不同的情况: 浮点误差的大小可能与结果的大小有关,因此对误差的容忍度必须与结果成正比。或者幅度可能在很大程度上是绝对的(相对于结果,也许相对于问题的某些其他方面),因此对错误的容忍度必须是一个固定的数字。阈值一侧的错误可能是可以容忍的,而另一侧的错误可能不是(例如在接近 1 处取反正弦值或在接近 0 处取平方根时)。
如果您不关心误报,那么您可以简单地用 替换您的测试true
,这将消除所有误报。如果这对您来说是不可接受的,那么您需要确定哪些误报是不可接受的。
此确定高度依赖于您正在执行的计算及其目的。确定计算中可能出现的舍入误差、它们将如何影响结果以及这些误差在您的应用程序中是否可以容忍是很重要的。