matlab中roots和polyval函数的问题咨询,谢谢大神们~

问题是我用roots函数求解出的实根为什么仍然带有b=0的虚部?比如roots([1 3 3 1]),ans=(-1.0000 + 0.0000i -1.0000 - 0.0000i -1.0000 + 0.0000i)',请问怎么让它不显示虚部,我看教程上就没有虚部啊。由此而来的第二个问题是,当我用polyval对所求的根带回运算时,结果不为0啊。比如polyval([1 3 3 1] , ans')的结果是1.0e-14 *0.1221 + 0.0000i 0.1221 + 0.0000i 0.1221 - 0.0000i,而polyval([1 3 3 1],[-1 -1 -1])结果就是0 0 0 。请问这是为什么啊?(可能说的不太清楚,如图)小白问题大家见笑了

浮点数在计算机内部表示是不精确的,因为计算机内部采用二进制表示,像0.1这种小数,实际上需要无限个二进制位才能存储(计算机基础里学过二进制小数表示的乘二取整法吧),计算机资源有限,所以这是不可能的。故对于浮点数,才有(单/双)精度一说,即只保留有限个二进制位。这是误差的来源。

问题1) 你可以调用 real(ans),只保留实部,去掉虚部。
问题2) 在问题1的基础上即使你调用了real 只保留实部,使得roots的结果看起来是-1.0000了,调用polyval的结果仍然不会是0。这是因为 matlab 显示结果只显示有限位的小数,看起来是-1.0000,实际可能是-1.0000000000000000000000000000000091,故你用polyval只会得到一个足够小的数(你这里是10^-14),而不是严格的0。而用[-1 -1 -1]去调用polyval会得到0,因为-1是精确的整数。
温馨提示:答案为网友推荐,仅供参考