我目前有以下代码:
count = 20;
n = zeros(count, 1);
P = zeros(count, 1);
for i = 1:count
n(i) = i;
P(i) = sym(i)^i + (sym(1-i))^(i-1);
if i == (count)
T = table(n,P)
end
end
这给了我一张带有一组值的表。但是,某些值失去精度,因为它们的位数太多。
我知道MATLAB允许高达536870913的精度。如何使表值不丢失精度?
注意::如果我仅要执行以下操作(例如):sym(200)^2010
,我将获得具有4626位数字的完整精度值。但是,出于某些奇怪的原因,对表值执行此操作似乎无效。
如果有人可以帮助我,我将非常感激,因为我已经为此奋斗了几个小时。
答案 0 :(得分:3)
正如@Daniel所评论的那样,问题在于,将其存储在P
中时,您将转换为两倍。 MATLAB仅具有使用符号变量时提到的精度,但是进入数字世界时,只能存储有限量的精度。
确切地说,将P
定义为双精度数(zeros
返回双精度矢量)后,您可以存储的最大整数(使所有较小的整数都精确)为2 ^ 53,比您的P(20)
小得多。这意味着不能确保在double
值向量上大于2 ^ 53的整数都是精确的。
因此,您的解决方案是避免强制转换,将变量存储在sym
类型的P
上。请注意,以上内容也适用于以后的数学。如果打算在某个方程式中使用此变量,请记住,将其传递给数值形式时,将会失去精度。通常这并不重要,因为精度损失很小,但是您应该知道这一点。
如果您想了解有关计算机上数值精度如何工作的更多信息,建议阅读以下问答:Why is 24.0000 not equal to 24.0000 in MATLAB?
符号解决方案:
count = 20;
n = zeros(count, 1);
P = sym('integer',[count, 1]);
for i = 1:count
n(i) = i;
P(i) = sym(i)^i + (sym(1-i))^(i-1);
if i == (count)
T = table(n,P)
end
end
返回
>> T.P(20)
ans =
102879180344339686410876021