打印时尝试获取数字而不是 NaN 值
Attempt to get numbers instead of NaN values when printing
我有一个带有 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
看看阶乘的文档:
Note that the factorial function grows large quite quickly, and
even with double precision values overflow will occur if N > 171.
For such cases consider 'gammaln'.
在你的第二次迭代中,你已经在做 factorial (200)
which returns Inf
然后 Inf/Inf
returns NaN
.
你可以自己计算分数。
因此,您需要直接计算 $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
...
我有一个带有 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
看看阶乘的文档:
Note that the factorial function grows large quite quickly, and even with double precision values overflow will occur if N > 171. For such cases consider 'gammaln'.
在你的第二次迭代中,你已经在做 factorial (200)
which returns Inf
然后 Inf/Inf
returns NaN
.
你可以自己计算分数。 因此,您需要直接计算 $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
...