Col*_*ers 3 floating-point matlab integer
我的问题 - 第1部分:测试浮点数是否为"整数"(在Matlab中)的最佳方法是什么?
我对第1部分的当前解决方案:显然isinteger
是,因为这会测试元素的类型而不是值,所以目前我解决了这样的问题:
abs(round(X) - X) <= sqrt(eps(X))
Run Code Online (Sandbox Code Playgroud)
但也许有更原生的Matlab方法?
我的问题 - 第2部分:如果我目前的解决方案确实是最好的方法,那么我想知道是否存在推荐的一般容差?正如你从上面所看到的,我使用了sqrt(eps(X))
,但我没有任何充分的理由.也许我应该使用eps(X)
,或者也许5 * eps(X)
?任何建议都是最受欢迎的.
示例:在Matlab中,sqrt(2)^2 == 2
返回False.但实际上,我们可能希望逻辑条件返回True.我们可以做到这一点使用上述方法,因为sqrt(2)^2
实际上等于2 + eps(2)
(即良好的公差范围内sqrt(eps(2))
.但是,这是否意味着我应该总是用eps(X)
我的宽容,或者是有充分的理由来使用更大的宽容,比如5 * eps(X)
,或sqrt(eps(X))
?
更新(2012-10-31): @FakeDIY指出我的问题部分与此SO问题重复(道歉,不知道我在初始搜索中是如何错过的).鉴于此,我想强调问题的"容忍"部分(在该链接中没有涉及),即是eps(X)
一种明智的容忍,或者我应该使用更大的东西5 * eps(X)
,如果是,为什么呢?
更新(2012-11-01):感谢大家的回复.因为我觉得它们对问题的各个方面都有意义,所以我对所有三个答案都进行了+1.我正在给Eric Postpischil一个答案,因为答案确实很好地解决了问题的容忍部分(并且在这个时间点它有最多的赞成).
不,没有推荐的一般宽容,也不可能.
计算结果与数学上理想结果之间的差异是产生计算结果的操作的函数.由于这些操作特定于每个应用程序,因此没有测试计算结果的任何属性的一般规则.
要设计正确的测试,您必须确定计算过程中可能发生的错误,确定计算结果中产生的错误的界限,并测试计算结果是否与理想结果(可能是最接近的整数)相差小于这些界限.您还必须确定这些边界是否足够小以满足您的应用程序的要求.(使用宽松的测试,接受整数不是整数的东西会减少错误的否定[错误地拒绝结果作为理想结果为整数的整数]但会增加误报[结果的错误接受为整数其中理想结果不是整数].)
(注意,甚至可能是测试好像错误界限为零会产生错误否定:当理想结果不是整数时,计算可能产生一个完全正整数的结果,因此任何容错,即使为零,也会错误地报告此结果是一个整数.如果这对您的应用程序来说是不可接受的,那么在这种情况下,必须重新设计计算.)
在没有具体应用知识的情况下,不仅无法说明可能使用的数值公差,也无法说明公差是绝对的,应该是相对于计算值还是相对于目标值,以ULP(最低精度单位)测量,或以其他方式设置.这是因为可以以各种方式将错误引入计算中.例如,如果在一个小的相对误差a
和a
和b
在值接近,则a-b
具有大的相对误差.另外,如果c
很大,那么(a-b)*c
绝对误差很大.
归档时间: |
|
查看次数: |
6479 次 |
最近记录: |