【发布时间】:2014-10-14 03:57:34
【问题描述】:
这是一个关于Matlab中的函数nchoosek的问题。
我要找nchoosek(54,25),和54C25一样。由于答案大约是 10^15,所以我最初使用int64。然而,就象征性而言,答案是错误的。
输入:
nchoosek(int64(54),int64(25))
nchoosek(sym(54),sym(25))
输出:
1683191473897753
1683191473897752
您可以看到它们相差一个。这不是一个真正紧迫的问题,因为我现在使用sym。但是有人能告诉我为什么会这样吗?
编辑:
我正在使用 R2013a。
我看了一下nchoosek.m,发现如果输入在int64,代码可以简化成
function c = nchoosek2(v,k)
n = v; % rename v to be n. the algorithm is more readable this way.
classOut = 'int64';
nd = double(n);
kd = double(k);
nums = (nd-kd+1):nd;
dens = 1:kd;
nums = nums./dens; %%
c = round(prod(nums));
c = cast(c,classOut);
end
但是,int64(prod(nums./dens)) 的结果对我来说与prod(sym(nums)./sym(dens)) 不同。每个人都一样吗?
【问题讨论】:
-
您是否看到警告说在第一种情况下结果可能不准确?
-
没有。没有显示警告。
-
在文档中说,“双精度输入的结果只能精确到 15 位,单精度输入的结果只能精确到 8 位”。但也有人说,如果输出太大,MATLAB 会显示一个警告,即结果可能不准确。所以,如果没有警告,我不确定这是你的情况。
-
我使用的是R2013a,可能是这个问题的原因
-
似乎版本相关,我可以在 2013a 上重现此问题
标签: matlab combinations int64 symbolic-computation precision