* 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.
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);
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() {