1

我有一个带有 for 循环的简单程序,我在其中计算一些打印到屏幕上的值,但只打印第一个值,其余的只是 NaN 值。有没有什么办法解决这一问题?我想这些数字可能有很多小数,因此是 NaN 问题。

程序输出:

0.18410
NaN
NaN
NaN
NaN

等等

这是代码,也许它有帮助:

for i=1:30
    t = (100*i)*1.1*0.5;
    b = factorial(round(100*i)) / (factorial(round((100*i)-t)) * factorial(round(t)));

    % binomial distribution
    d = b * 0.5^(t) * 0.5^(100*i-(t));

    % cumulative 
    p = binocdf(1.1 * (100*i) * 0.5,100*i,0.5);

    % >=  AT LEAST
    result = 1-p + d;
    disp(result);
end
4

2 回答 2

0

你可以自己计算分数。因此,您需要直接计算 $d$。然后您可以获取分子和分母的所有值并手动将它们相乘,并确保结果不会变得太大。以下代码在速度和内存方面很差,但它可能是一个好的开始:

for i=1:30
t = (55*i);
b = factorial(100*i) / (factorial(100*i-t) * factorial(t));

% binomial distribution
d = b * 0.5^(t) * 0.5^(100*i-(t));

numerators = 1:(100*i);
denominators = [1:(100*i-t),1:55*i,ones(1,100*i)*2];
value = 1;
while length(numerators) > 0 || length(denominators) > 0
    if length(numerators) == 0 
        value = value/denominators(1);
        denominators(1) = [];
    elseif length(denominators) == 0
        value = value* numerators(1);
        numerators(1) = [];
    elseif value > 10000
        value = value/denominators(1);
        denominators(1) = [];
    else
        value = value* numerators(1);
        numerators(1) = [];
    end
end

% cumulative 
p = binocdf(1.1 * (100*i) * 0.5,100*i,0.5);

% >=  AT LEAST
result = 1-p + value;
disp(result);
end

输出:

0.1841
0.0895
0.0470
0.0255
0.0142
0.0080
0.0045
...
于 2015-03-03T13:46:58.367 回答
0

看一下阶乘的文档:

请注意,阶乘函数会很快变大,如果 N > 171,即使是双精度值也会发生溢出。对于这种情况,请考虑“gammaln”。

在您的第二次迭代中,您已经在执行factorial (200)which 返回Inf然后Inf/Inf返回NaN

于 2015-03-03T13:04:02.200 回答