matlab - 在 Matlab 中测试 float 是否为整数

标签 matlab floating-point integer

我的问题 - 第 1 部分:测试 float 是否为“整数”(在 Matlab 中)的最佳方法是什么?

我目前第 1 部分的解决方案: 显然,isinteger 已经过时了,因为它测试的是元素的类型,而不是值,所以目前,我解决了像这样的问题:

    abs(round(X) - X) <= sqrt(eps(X))

但也许有更原生的 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 指出我的问题部分重复了 this SO question (抱歉,不确定我在最初的搜索中是如何错过它的)。鉴于此,我想强调问题的“公差”部分(该链接未涵盖),即 eps(X) 是一个合理的公差,还是我应该使用更大的东西,像 5 * eps(X),如果是,为什么?

更新 (2012-11-01): 感谢大家的回复。我已经 +1 了所有三个答案,因为我觉得它们都对问题的各个方面做出了有意义的贡献。我正在给 Eric Postpischil 打勾,因为这个答案确实很好地解决了问题的容忍度部分(并且它在这个时间点获得了最多的赞成票)。

最佳答案

不,没有推荐的一般公差,也不可能有。

计算结果与数学理想结果之间的差异是产生计算结果的操作的函数。因为这些操作特定于每个应用程序,所以没有通用规则来测试计算结果的任何属性。

要设计一个合适的测试,你必须确定在计算过程中可能发生了什么错误,确定计算结果中产生的误差的界限,并测试计算结果与理想结果(可能是最接近的整数)的差异是否小于比那些界限。您还必须确定这些边界是否足够小以满足您的应用程序的要求。 (使用接受非整数作为整数的宽松测试会减少假阴性[将结果错误地拒绝为整数,而理想结果应该是整数]但会增加假阳性[将结果错误地接受为整数理想的结果不是整数]。)

(请注意,甚至可能出现错误边界为零的测试会产生假阴性:当理想结果不是整数时,计算产生的结果可能恰好是整数,因此任何容错,即使是零,也会错误地报告这个结果是一个整数。如果这对您的应用程序来说是 Not Acceptable ,那么在这种情况下,必须重新设计计算。)

在没有具体应用知识的情况下,不仅不可能说明可能使用的数字公差,而且不可能说明公差应该是绝对的,应该是相对于计算值还是目标值,应以 ULP(最小精度单位)测量,或应以其他方式设置。这是因为错误可能以多种方式引入计算。例如,如果 a 中存在较小的相对误差,并且 ab 的值接近,则 a-b 相对误差较大。此外,如果 c 很大,则 (a-b)*c 有很大的绝对误差。

关于matlab - 在 Matlab 中测试 float 是否为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13152758/

相关文章:

matlab - 在matlab中将包含二进制数据的文本文件读取为单个矩阵

matlab - 定时器函数的错误处理

java - 序列递归

sql - T-SQL 其中 int=@var/@var=null?

mysql - 1292 截断了不正确的 INTEGER 值

Matlab:重叠的子图标题

matlab - 如何在matlab中的同一个窗口中绘制多个图形

c++ - C 或 C++ 中的十进制算术?

c - 如何获得以字节为单位的 float ?

javascript - 浮点尾数是否从右到左存储位