如何防止表值的精度损失?

时间:2019-12-11 05:40:22

标签: matlab

我目前有以下代码:

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位数字的完整精度值。但是,出于某些奇怪的原因,对表值执行此操作似乎无效。 如果有人可以帮助我,我将非常感激,因为我已经为此奋斗了几个小时。

1 个答案:

答案 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