我想比较两个符号变量(数字)。整个问题归结为以下代码。
R = vpa(0.555555555555555555555555555);
isAlways(R>R*(1-sym(10^(-10))))
isAlways(R>R*(1-sym(10^(-50))))
两次比较都应返回1
,但第二次返回0
。
我的解决方案:
digits(51);
R = vpa(0.555555555555555555555555555);
isAlways(R>R*(1-sym(10^(-10))))
isAlways(R>R*(1-sym(10^(-50))))
答案 0 :(得分:2)
vpa
使用可变精度浮点运算(默认情况下为32位有效数字)评估符号输入...所以在您的情况下发生了什么
>> R = vpa(0.555555555555555555555555555)
R =
0.55555555555555555555555555555556
>> R*(1-sym(10^(-50)))
ans =
0.55555555555555555555555555555556
32位数绝对不足以存储1-10^(-50)
的实际值。
如果不对vpa()
施加压力,您可以将R
和R * (1 - 10^(-50))
声明为符号(实际上是0.5555555... = 5/9
),并对它们进行比较:
>> R = str2sym('5/9');
>> X = str2sym('5/9 * (1 - 10^(-50))');
>> isAlways(R > X)
ans =
logical
1