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 位。但是,出于某种奇怪的原因,对表值执行此操作似乎不起作用。如果有人可以帮我解决这个问题,我将非常感激,因为我已经为此苦苦挣扎了几个小时。
解决方案
正如@Daniel 评论的那样,问题在于您在将其存储在P
. MATLAB 仅具有您在使用符号变量时提到的精度,但是当您进入数值世界时,您只能存储有限的精度。
确切地说,一旦定义P
为双精度(zeros
返回双精度向量),您可以存储的最大整数使其所有较小的整数都是精确的,是 2^53,比您的P(20)
. 这意味着任何大于 2^53 的整数都不能保证在有double
值向量上是精确的。
因此,您的解决方案是避免强制转换,将变量存储在sym
type上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
推荐阅读
- list - 使用 Dart & Flutter,我想提取 CheckBoxListTiles 的选中值以创建一个列表,其中包含每个选中 Checkbox 的标题
- javascript - react-dom.development.js:26086 未捕获错误:目标容器不是 DOM 元素。完全不同的代码
- java - Java/Spring-boot/Mockito @MockBean 注释工作奇怪
- php - 通过比较 2 列进行分组
- flutter - 将颜色应用于 Flutter 小部件时出错
- categorical-data - 使用 Catboost 的“暖一编码”分类变量?
- sql - SQL Server:主记录并显示每个详细记录的数量
- jquery - JQGrid 不显示所有数据
- azureservicebus - Azure 服务总线计费
- c++ - 看似有效的代码中的未知类型名称“GsetBrakeMode”