Getting NaN while using the ratio of power and factorial
Mostrar comentarios más antiguos
1
With the following piece of code, I get NaN
l=0;
lp=2;
d=200;
a2= ((-sqrt(d))^lp);
a3 =((-sqrt(d))^l);
sum1=0
for m=0:500
a1= ((2^m)*(d^m))/(factorial(m))
mul=a1*a2*a3;
sum1=sum1+mul;
end
Is there any way to modify the code to get rid of the issue?
1 comentario
James Tursa
el 13 de Jul. de 2022
Cross posted on stackoverflow and answered there over 4 hours ago. If you had simply checked the answer there you could have saved yourself the trouble of posting here and getting essentially the same answer.
Respuestas (4)
exp(400)*200 is quite large ...
format long
l=0;
lp=2;
d=200;
a2= ((-sqrt(d))^lp);
a3 =((-sqrt(d))^l);
a1 = 1.0;
sum1 = a1;
for m=0:500
a1 = a1* 2*d/(m+1);
sum1=sum1+a1;
end
sum1 = sum1*a2*a3
exp(400)*200
m = 500;
d = 200;
The numerator and denominator of your expression (for sufficiently large m) both overflow to inf. Dividing infinity by infinity results in a NaN.
numerator = 2^m*d^m
denominator = factorial(m)
x = numerator / denominator
One potential approach to avoid this is to avoid explicitly computing 2^m, d^m, or factorial(m).
numeratorVector = repmat(2*d, 1, m); % prod(numeratorVector) would effectively give numerator
denominatorVector = 1:m; % prod(denominatorVector) would effectively give denominator
xVector = numeratorVector./denominatorVector;
format longg
x2 = prod(xVector)
Let's check symbolically.
numeratorSymbolic = sym(2*d)^m;
vpa(numeratorSymbolic) % Pretty big
denominatorSymbolic = factorial(sym(m));
vpa(denominatorSymbolic) % Also pretty big
x3 = vpa(numeratorSymbolic/denominatorSymbolic) % Big but not quite as big as above
You could be a little more sophisticated / clever if you wanted (preemptively cancelling out factors of 2 in numeratorVector by dividing even values in denominatorVector by 2.) Or you could keep track of x for each value of m then figure out what you need to multiply it by to get x for the next value of m.
Benjamin Thompson
el 13 de Jul. de 2022
0 votos
The factorial function output increases very fast as input increases. See "doc factorial" for details. The output is "inf" for input of 171 or larger.
1 comentario
But 400^m overflows for m > 118 so this whole expression becomes infinite or undefined beyond that point.
d = 200;
(2*d)^118
(2*d)^119
Vijeta Singh Yadav
el 13 de Jul. de 2022
0 votos
Data overflow and underflow problem exists in the code
Categorías
Más información sobre NaNs en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!