双/单相等直至预定义错误

时间:2012-08-08 08:37:16

标签: c# .net floating-point

是否存在实现<,==和>的浮点数的标准类以某种方式忽略“小数字错误”(之前必须指定小)?

我知道我可以自己实现这样的东西,但也许我不需要重新发明它。

2 个答案:

答案 0 :(得分:2)

MathNET.Numerics库中有一个静态Precision类,它提供了许多请求的功能。没有运算符重载,但也许可用的方法仍然可以证明是足够的。

答案 1 :(得分:1)

没有广泛使用的类或库,因为它是一种糟糕的编程技术,并且在某种程度上它提供了任何好处,并不容易适应不同的情况。

接受不相等的数字等于减少错误否定(由于浮点运算中的舍入而不能接受的结果,但如果精确计算则结果相同)但会增加误报(结果被接受为相等但是如果精确计算则不相等)。没有一般原则可以平衡假阴性的减少与假阳性的增加,反之亦然,因此这个问题没有通用的解决办法。

此外,出现了许多不同的情况:浮点误差的大小可能与结果的大小有关,因此误差容差必须与结果成比例。或者幅度可能在很大程度上是绝对的(关于结果,也许相对于问题的某些其他方面),因此误差容差必须是固定数。阈值一侧的误差可能是可以容忍的,而另一侧的误差可能不是(如在一个或接近零的平方根附近采用反正弦)。

如果您不关心误报,那么您可以简单地用true替换您的测试,这将消除所有误报。如果您不接受,那么您需要确定哪些误报是不可接受的。

此决定高度依赖于您正在执行的计算及其目的。重要的是要确定计算中可能出现的舍入错误,它们将如何影响您的结果,以及您的应用程序中的错误是否可以容忍。