首页 > 解决方案 > 如何防止表值中的精度损失?

问题描述

我目前有以下代码:

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 位。但是,出于某种奇怪的原因,对表值执行此操作似乎不起作用。如果有人可以帮我解决这个问题,我将非常感激,因为我已经为此苦苦挣扎了几个小时。

标签: matlab

解决方案


正如@Daniel 评论的那样,问题在于您在将其存储在P. MATLAB 仅具有您在使用符号变量时提到的精度,但是当您进入数值世界时,您只能存储有限的精度。

确切地说,一旦定义P为双精度(zeros返回双精度向量),您可以存储的最大整数使其所有较小的整数都是精确的,是 2^53,比您的P(20). 这意味着任何大于 2^53 的整数都不能保证在有double值向量上是精确的。

因此,您的解决方案是避免强制转换,将变量存储在symtype上P。请注意,上述内容也适用于以后的数学。如果您打算在某个方程中使用此变量,请记住,当您将其传递为数值形式时,您将失去精度。通常这无关紧要,因为丢失的精度非常小,但您应该知道这一点。

如果您想了解更多关于数值精度如何在计算机上工作的信息,我建议阅读以下问答:为什么 MATLAB 中的 24.0000 不等于 24.0000?

符号解决方案:

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

推荐阅读