【问题标题】:Matlab syms variable precision?Matlab syms变量精度?
【发布时间】:2013-09-06 23:22:20
【问题描述】:

只是在 matlab 中遇到了一些可变精度问题..

我有代码:

x = 0.1;
syms y;
S = solve(x+1==(1+y)/(1-y),y);
y = double(S);
val = abs(((2^2)*(y^2))/(2*(y-1)^2))

但 val 总是四舍五入。 我应该得到val = 0.0049999,但我得到的是val = 0.0050

有人知道为什么吗?

谢谢。

编辑:添加额外代码

x = 0.1;
syms y;
S = solve(x+1==(1+y)/(1-y),y);
y = double(S);
val = abs(((2^2)*(y^2))/(2*(y-1)^2))
sprintf('%22.20f',val)

for i=1:2
    val= val+((2^i)*(y^i))/(i*(y-1)^i);
    sprintf('%22.20f',val)
end

第一个 sprintf 工作并显示正确的舍入,但第二个没有!

【问题讨论】:

  • Ni 在您的附加代码中有何关联?
  • 抱歉,Ni
  • 你期望什么输出?我得到0.00499999999999999924-0.09500000000000000111-0.08999999999999999667
  • 我得到了四舍五入的值,特别是0.10。我把我的代码从循环中拿出来,发现了一个问题。如果我有if abs(val-1) == 1 后跟break;end,我会遇到舍入问题。否则不行。有什么想法吗?
  • 您从哪里获得0.1?此外,您需要这些数字做什么?

标签: matlab variables precision symbolic-math arithmetic-expressions


【解决方案1】:

您是否可能只是将显示数字的偏好设置为短而不是长?如果您消除了这种可能性,将会有所帮助。

【讨论】:

    【解决方案2】:

    这与floating-point representation 以及Matlab displays such numbers 的可读性有关。如果将此行添加到代码的末尾:

    sprintf('%22.20f',val)
    

    你会得到:

    ans =
    
    0.00499999999999999924
    

    编辑
    尽管它在技术上处理 Python,this website 提供了关于浮点表示的限制的简要概述。

    【讨论】:

    • 它是否只是因为它格式化整数以进行打印的方式而看起来是四舍五入的?我发布的代码只是一个小sn-p,实际功能在一个循环中。如果我把你的打印放在循环上面,它就可以工作。但是在循环中我仍然遇到四舍五入的问题......我现在将代码发布在 OP 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2016-09-29
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多