Matlab给出了带有向量参数的mod(),isequal(),floor()函数的错误答案

时间:2013-02-04 19:52:17

标签: matlab

我正在使用matlab来解决混合整数编程,在我从linprog获得解决方案之后,我想评估它们是否都是整数(x是n维),但我无法想出办法来做到这一点。

所有功能,例如mod(x,1) == 0isequal(x,floor(x))都会产生错误的反响。

更奇怪的是,如果您手动输入具有相同参数的矢量,则结果是正确的。

显示结果:(这里的所有x都是从linprog的结果中获得的)。任何人都可以帮忙解决这个问题,或者提出一些其他有用的评估方法吗?

K>> x

x =

    7.0000
    1.0000

K>> mod(x,1)

ans =

    0.0000
    1.0000

K>> x

x =

    6.0000
    3.0000

K>> isequal(x,floor(x))

ans =
    0

1 个答案:

答案 0 :(得分:2)

似乎是来自linprog的积分1,实际上是一个非常接近1的浮点数,但不等于它。只是你(默认情况下)无法通过在MATLAB中输出数字来区分。请参阅此问题comparing floating point values。另请参阅有关display format of numbers的MATLAB手册页。

默认情况下,MATLAB使用format short显示数字:

  

format将浮点数值的显示设置为默认显示格式,即固定的十进制短格式。此格式显示5位缩放的定点值。

因此,1 – 1e–10 显示为1,即使它不等于为1.同样,mod(1 – 1e–10, 1)将是显示为1,即使它确实是1 – 1e–10

如果您手动将x设置为其显示的表示,则所有不太重要的数字都会被截断,“奇怪地”会给您预期的结果。

在输入命令x后检查format long