normpdf is taking zeros

5 views (last 30 days)
hey yo
hey yo on 25 Sep 2021
Commented: John D'Errico on 5 May 2024
Hello, I am using the normpdf command to evaluate a function in MATLAB. When the argument of normpdf is too small, MATLAB reports a zero. Is is possible to get the exact value of normpdf instead of 0?
  4 Comments
Anjali
Anjali on 5 May 2024
Hey, I'm stuck on similar problem and not able to decode it, how did you proceed further
John D'Errico
John D'Errico on 5 May 2024
I showed what you can do in my answer. If you will form the product of numbers, AND some of those numbers in the product are hugely large, you can always take the logs of each term in the product, then add the logs. Then exponentiate the sum at the end.
And you should see that the log of a normal PDF is trivially easy to compute. For example, even without using syms, we can do that:
mu = 0;
sig = 1;
x = -77;
logp = -(x-mu).^2/sig^2/2 - log(sig) - log(sqrt(2*pi))
logp = -2.9654e+03
Of course, that is a pretty large negative number. But now you can work with the logs of those terms. In the end, the result will still probably be numerical garbage, and still very likely result in an underflow, becaluse logp is such a negative result. But unless you are willing to work entirely in terms of higher precision numbers, this is the best you can do.

Sign in to comment.

Accepted Answer

John D'Errico
John D'Errico on 25 Sep 2021
Edited: John D'Errico on 25 Sep 2021
No. At least, not in double precision. The "exact" value there is impossible to represent in a double precision number.
The normal pdf at z = -77 should be:
mu = 0;
sig = 1;
x = sym(-77);
p = exp(-(x-mu).^2/sig^2/2)*1/(sig*sqrt(2*sym('pi')))
p = 
vpa(p)
ans = 
Do you understand this is a number with around 1288 zeros after the decimal point, before you see any digits?
As such, the result underflows in double precision. You get ZERO.
realmin
ans = 2.2251e-308
Actually, you can go about as far as -38 or so, before an underflow occurs, with the result as what is known as a denormalized number. But that is around the limit. And even most computations with those numbers at that level will still yield numerical garbage.
normpdf(-38)
ans = 1.0972e-314
You can want what you want, but this is not possible working in double precision. If you are willing to use higher precision tools, such as syms, then yes, you can.
  1 Comment
hey yo
hey yo on 25 Sep 2021
Thank you for taking the time to post this reply. It is very valuable.

Sign in to comment.

More Answers (0)

Categories

Find more on Bounding Regions in Help Center and File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!