打印时尝试获取数字而不是NaN值

时间:2015-03-03 12:04:29

标签: printing octave binomial-cdf

我有一个带有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

2 个答案:

答案 0 :(得分:0)

看看factorial的文档:

  

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

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

答案 1 :(得分: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
...