# Anomalous histogram for small argument

1 view (last 30 days)
Gordon Edwards on 6 Sep 2019
Commented: Gordon Edwards on 7 Sep 2019
Running the following code from the command line with c = 1e-15 or greater leads to a normal histogram
c = 1e-15; figure; histogram(c * rand(100,1)) Running the following code with c = 1e-16 or less leads to an incorrect histogram
c = 1e-16; figure; histogram(c * rand(100,1)) The problem appears also in apps when the histogram function is invoked.
Is this a bug?
Gordon

Bruno Luong on 7 Sep 2019
Edited: Bruno Luong on 7 Sep 2019
Yes it is a BUG. I chase back and in the file
C:\Program Files\MATLAB\R2019a\toolbox\matlab\datafun\+matlab\+internal\+math\binpicker.m
line #20 (R2019a)
there is a test
if xrange > max(sqrt(eps(xscale)), realmin(class(xscale)))
To me the correct test should be (without sqrt)
if xrange > max(eps(xscale), realmin(class(xscale)))
Now if I change this line and rerun the code
c = 1e-16; figure; histogram(c * rand(100,1))
it produces correct plot More seriously, the function binpicker is called by HISTCOUNT. So HISTCOUNT is also buggy. Not only plotting but calculation might be wrong.

#### 1 Comment

Gordon Edwards on 7 Sep 2019
Thanks for your reply.and I believe that you have spotted the error in function binpicker.Since eps(x) ~ 1e-16*x, and in my case xscale and xrange are nearly equal, the condition that
xrange > sqrt(eps(xscale))
leads to xrange >~ 1e-16 which is what I find.

Jackson Burns on 7 Sep 2019
Here's a similar question asked a few years ago which was never really solved either. This comment may be your best approach, but I would reccomend just bringing the values to unity with something like this:
c = 1E-16;
figure
mydata = c * rand(100,1);
histogram(mydata./max(mydata))
You could then modify the xticklabels to match whatever the original values were.

R2019a

### Community Treasure Hunt

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

Start Hunting!