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