Skip to content

Commit

Permalink
Bugfix: Improve polyfill function of log10 to return whole powers of …
Browse files Browse the repository at this point in the history
…10 (chartjs#5275)

* Bugfix: Improve polyfill function of log10 to return whole powers of 10
        as integer values, as it caused endless loop in IE11 in the tick
        creation loop.

* Compare floating-point numbers directly instead of using unnecessary division.
  • Loading branch information
jcopperfield authored and etimberg committed Feb 20, 2018
1 parent 8b982e0 commit 3508bb0
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
8 changes: 7 additions & 1 deletion src/core/core.helpers.js
Expand Up @@ -159,7 +159,13 @@ module.exports = function(Chart) {
return Math.log10(x);
} :
function(x) {
return Math.log(x) / Math.LN10;
var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.
// Check for whole powers of 10,
// which due to floating point rounding error should be corrected.
var powerOf10 = Math.round(exponent);
var isPowerOf10 = x === Math.pow(10, powerOf10);

return isPowerOf10 ? powerOf10 : exponent;
};
helpers.toRadians = function(degrees) {
return degrees * (Math.PI / 180);
Expand Down
8 changes: 6 additions & 2 deletions test/specs/core.helpers.tests.js
Expand Up @@ -194,8 +194,12 @@ describe('Core helper tests', function() {

it('should do a log10 operation', function() {
expect(helpers.log10(0)).toBe(-Infinity);
expect(helpers.log10(1)).toBe(0);
expect(helpers.log10(1000)).toBeCloseTo(3, 1e-9);

// Check all allowed powers of 10, which should return integer values
var maxPowerOf10 = Math.floor(helpers.log10(Number.MAX_VALUE));
for (var i = 0; i < maxPowerOf10; i += 1) {
expect(helpers.log10(Math.pow(10, i))).toBe(i);
}
});

it('should correctly determine if two numbers are essentially equal', function() {
Expand Down

0 comments on commit 3508bb0

Please sign in to comment.