Skip to content

Commit 6dc9904

Browse files
committed
give Lib.findBin a tiny buffer for on-the-line points
1 parent 59b6463 commit 6dc9904

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

src/lib/search.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
var isNumeric = require('fast-isnumeric');
1313
var loggers = require('./loggers');
1414

15+
// don't trust floating point equality - fraction of bin size to call
16+
// "on the line" and ensure that they go the right way specified by
17+
// linelow
18+
var roundingError = 1e-9;
19+
1520

1621
/**
1722
* findBin - find the bin for val - note that it can return outside the
@@ -26,20 +31,21 @@ var loggers = require('./loggers');
2631
exports.findBin = function(val, bins, linelow) {
2732
if(isNumeric(bins.start)) {
2833
return linelow ?
29-
Math.ceil((val - bins.start) / bins.size) - 1 :
30-
Math.floor((val - bins.start) / bins.size);
34+
Math.ceil((val - bins.start) / bins.size - roundingError) - 1 :
35+
Math.floor((val - bins.start) / bins.size + roundingError);
3136
}
3237
else {
33-
var n1 = 0,
34-
n2 = bins.length,
35-
c = 0,
36-
n,
37-
test;
38-
if(bins[bins.length - 1] >= bins[0]) {
38+
var n1 = 0;
39+
var n2 = bins.length;
40+
var c = 0;
41+
var binSize = (n2 > 1) ? (bins[n2 - 1] - bins[0]) / (n2 - 1) : 1;
42+
var n, test;
43+
if(binSize >= 0) {
3944
test = linelow ? lessThan : lessOrEqual;
4045
} else {
4146
test = linelow ? greaterOrEqual : greaterThan;
4247
}
48+
val += binSize * roundingError * (linelow ? -1 : 1) * (binSize >= 0 ? 1 : -1);
4349
// c is just to avoid infinite loops if there's an error
4450
while(n1 < n2 && c++ < 100) {
4551
n = Math.floor((n1 + n2) / 2);

test/jasmine/tests/histogram_test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ describe('Test histogram', function() {
423423
var trace4 = {x: [1, 1.2, 1.4, 1.6], yaxis: 'y2'};
424424

425425
expect(calcPositions(trace1, [trace2, trace3, trace4])).toEqual([1, 2, 3, 4]);
426-
expect(calcPositions(trace3)).toBeCloseToArray([0.9, 1.1, 1.3], 5);
426+
expect(calcPositions(trace3)).toBeCloseToArray([1.1, 1.3], 5);
427427
});
428428

429429
describe('cumulative distribution functions', function() {

0 commit comments

Comments
 (0)