比较符号变量
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()
,您可以将 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
我正在尝试比较两个符号变量(数字)。整个问题归结为以下代码。
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()
,您可以将 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