比较符号变量

Compare symbolic variables

我正在尝试比较两个符号变量(数字)。整个问题归结为以下代码。

R = vpa(0.555555555555555555555555555);
isAlways(R>R*(1-sym(10^(-10))))
isAlways(R>R*(1-sym(10^(-50))))

两个比较应该return 1,但是第二个returns 0.


我的解决方案:

digits(51);
R = vpa(0.555555555555555555555555555);
isAlways(R>R*(1-sym(10^(-10))))
isAlways(R>R*(1-sym(10^(-50))))

为什么会遇到这个问题

vpa 使用可变精度浮点运算(默认为 32 位有效数字)评估 符号输入...所以你的情况是

>> R = vpa(0.555555555555555555555555555)

R =

0.55555555555555555555555555555556

>> R*(1-sym(10^(-50)))

ans =

0.55555555555555555555555555555556

32位肯定不够存储1-10^(-50)的实际值。

如何修复

无需强调 vpa(),您可以将 RR * (1 - 10^(-50)) 都声明为符号(实际上是 0.5555555... = 5/9),然后比较它们:

>> R = str2sym('5/9');
>> X = str2sym('5/9 * (1 - 10^(-50))');
>> isAlways(R > X)

ans =

  logical

   1