Created
January 24, 2023 17:24
-
-
Save amrali-eg/cf7505d9541dd4210c77dc681d4c6211 to your computer and use it in GitHub Desktop.
Decimal Rounding - Number.EPSILON vs Number.EPSILON v2 #jsbench (https://jsbench.github.io/#cf7505d9541dd4210c77dc681d4c6211) #jsbench #jsperf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8"/> | |
<title>Decimal Rounding - Number.EPSILON vs Number.EPSILON v2 #jsbench</title> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/1.0.0/benchmark.min.js"></script> | |
<script src="./suite.js"></script> | |
</head> | |
<body> | |
<h1>Open the console to view the results</h1> | |
<h2><code>cmd + alt + j</code> or <code>ctrl + alt + j</code></h2> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
(function (factory) { | |
if (typeof Benchmark !== "undefined") { | |
factory(Benchmark); | |
} else { | |
factory(require("benchmark")); | |
} | |
})(function (Benchmark) { | |
var suite = new Benchmark.Suite; | |
Benchmark.prototype.setup = function () { | |
// Solution 4 | |
var DecimalPrecision4 = (function() { | |
if (Math.trunc === undefined) { | |
Math.trunc = function(v) { | |
return v < 0 ? Math.ceil(v) : Math.floor(v); | |
}; | |
} | |
var powers = [ | |
1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, | |
1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, | |
1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22 | |
]; | |
var intpow10 = function(power) { | |
/* Not in lookup table */ | |
if (power < 0 || power > 22) { | |
return Math.pow(10, power); | |
} | |
return powers[power]; | |
}; | |
var toPrecision = function(num, significantDigits) { | |
// Return early for ±0, NaN and Infinity. | |
if (!num || !Number.isFinite(num)) | |
return num; | |
// Compute shift of the decimal point (sf - leftSidedDigits). | |
var shift = significantDigits - 1 - Math.floor(Math.log10(Math.abs(num))); | |
// Return if rounding to the same or higher precision. | |
var decimalPlaces = 0; | |
for (var p = 1; num != Math.round(num * p) / p; p *= 10) decimalPlaces++; | |
if (shift >= decimalPlaces) | |
return num; | |
// Round to "shift" fractional digits | |
var scale = intpow10(Math.abs(shift)); | |
return shift > 0 ? | |
Math.round(num * scale) / scale : | |
Math.round(num / scale) * scale; | |
}; | |
// Eliminate binary floating-point inaccuracies. | |
var stripError = function(num) { | |
if (Number.isInteger(num)) | |
return num; | |
return toPrecision(num, 15); | |
}; | |
var decimalAdjust = function myself(type, num, decimalPlaces) { | |
if (type === 'round' && num < 0) | |
return -myself(type, -num, decimalPlaces); | |
var p = intpow10(decimalPlaces || 0); | |
var n = stripError(num * p); | |
return Math[type](n) / p; | |
}; | |
return { | |
// Decimal round (half away from zero) | |
round: function(num, decimalPlaces) { | |
return decimalAdjust('round', num, decimalPlaces); | |
}, | |
// Decimal ceil | |
ceil: function(num, decimalPlaces) { | |
return decimalAdjust('ceil', num, decimalPlaces); | |
}, | |
// Decimal floor | |
floor: function(num, decimalPlaces) { | |
return decimalAdjust('floor', num, decimalPlaces); | |
}, | |
// Decimal trunc | |
trunc: function(num, decimalPlaces) { | |
return decimalAdjust('trunc', num, decimalPlaces); | |
}, | |
// Format using fixed-point notation | |
toFixed: function(num, decimalPlaces) { | |
return decimalAdjust('round', num, decimalPlaces).toFixed(decimalPlaces); | |
} | |
}; | |
})(); | |
// Solution 4 | |
var DecimalPrecision44 = (function() { | |
if (Math.trunc === undefined) { | |
Math.trunc = function(v) { | |
return v < 0 ? Math.ceil(v) : Math.floor(v); | |
}; | |
} | |
var toPrecision = function(num, significantDigits) { | |
// Return early for ±0, NaN and Infinity. | |
if (!num || !Number.isFinite(num)) | |
return num; | |
// Compute shift of the decimal point (sf - leftSidedDigits). | |
var shift = significantDigits - 1 - Math.floor(Math.log10(Math.abs(num))); | |
// Return if rounding to the same or higher precision. | |
var decimalPlaces = 0; | |
for (var p = 1; num != Math.round(num * p) / p; p *= 10) decimalPlaces++; | |
if (shift >= decimalPlaces) | |
return num; | |
// Round to "shift" fractional digits | |
var scale = Math.pow(10, Math.abs(shift)); | |
return shift > 0 ? | |
Math.round(num * scale) / scale : | |
Math.round(num / scale) * scale; | |
}; | |
// Eliminate binary floating-point inaccuracies. | |
var stripError = function(num) { | |
if (Number.isInteger(num)) | |
return num; | |
return toPrecision(num, 15); | |
}; | |
var decimalAdjust = function myself(type, num, decimalPlaces) { | |
if (type === 'round' && num < 0) | |
return -myself(type, -num, decimalPlaces); | |
var p = Math.pow(10, decimalPlaces || 0); | |
var n = stripError(num * p); | |
return Math[type](n) / p; | |
}; | |
return { | |
// Decimal round (half away from zero) | |
round: function(num, decimalPlaces) { | |
return decimalAdjust('round', num, decimalPlaces); | |
}, | |
// Decimal ceil | |
ceil: function(num, decimalPlaces) { | |
return decimalAdjust('ceil', num, decimalPlaces); | |
}, | |
// Decimal floor | |
floor: function(num, decimalPlaces) { | |
return decimalAdjust('floor', num, decimalPlaces); | |
}, | |
// Decimal trunc | |
trunc: function(num, decimalPlaces) { | |
return decimalAdjust('trunc', num, decimalPlaces); | |
}, | |
// Format using fixed-point notation | |
toFixed: function(num, decimalPlaces) { | |
return decimalAdjust('round', num, decimalPlaces).toFixed(decimalPlaces); | |
} | |
}; | |
})(); | |
}; | |
suite.add("Solution 4 (Double rounding v2) **/", function () { | |
/** Solution 4 (Double rounding v2) **/ | |
DecimalPrecision4.round(0.5, 0); | |
DecimalPrecision4.round(-0.5, 0); | |
DecimalPrecision4.ceil(1e-8, 2); | |
DecimalPrecision4.floor(1e-8, 2); | |
DecimalPrecision4.round(5.12, 1); | |
DecimalPrecision4.round(-5.12, 1); | |
DecimalPrecision4.ceil(5.12, 1); | |
DecimalPrecision4.ceil(-5.12, 1); | |
DecimalPrecision4.floor(5.12, 1); | |
DecimalPrecision4.floor(-5.12, 1); | |
DecimalPrecision4.trunc(5.12, 1); | |
DecimalPrecision4.trunc(-5.12, 1); | |
DecimalPrecision4.round(1.005, 2); | |
DecimalPrecision4.round(39.425, 2); | |
DecimalPrecision4.round(-1.005, 2); | |
DecimalPrecision4.round(-39.425, 2); | |
DecimalPrecision4.ceil(9.130, 2); | |
DecimalPrecision4.ceil(65.180, 2); | |
DecimalPrecision4.ceil(-2.260, 2); | |
DecimalPrecision4.ceil(-18.150, 2); | |
DecimalPrecision4.floor(2.260, 2); | |
DecimalPrecision4.floor(18.150, 2); | |
DecimalPrecision4.floor(-9.130, 2); | |
DecimalPrecision4.floor(-65.180, 2); | |
DecimalPrecision4.trunc(2.260, 2); | |
DecimalPrecision4.trunc(18.150, 2); | |
DecimalPrecision4.trunc(-2.260, 2); | |
DecimalPrecision4.trunc(-18.150, 2); | |
DecimalPrecision4.round(1262.48, -1); | |
DecimalPrecision4.round(1262.48, -2); | |
}); | |
suite.add("Solution 44 (Double rounding v2b) **/", function () { | |
/** Solution 44 (Double rounding v2b) **/ | |
DecimalPrecision44.round(0.5, 0); | |
DecimalPrecision44.round(-0.5, 0); | |
DecimalPrecision44.ceil(1e-8, 2); | |
DecimalPrecision44.floor(1e-8, 2); | |
DecimalPrecision44.round(5.12, 1); | |
DecimalPrecision44.round(-5.12, 1); | |
DecimalPrecision44.ceil(5.12, 1); | |
DecimalPrecision44.ceil(-5.12, 1); | |
DecimalPrecision44.floor(5.12, 1); | |
DecimalPrecision44.floor(-5.12, 1); | |
DecimalPrecision44.trunc(5.12, 1); | |
DecimalPrecision44.trunc(-5.12, 1); | |
DecimalPrecision44.round(1.005, 2); | |
DecimalPrecision44.round(39.425, 2); | |
DecimalPrecision44.round(-1.005, 2); | |
DecimalPrecision44.round(-39.425, 2); | |
DecimalPrecision44.ceil(9.130, 2); | |
DecimalPrecision44.ceil(65.180, 2); | |
DecimalPrecision44.ceil(-2.260, 2); | |
DecimalPrecision44.ceil(-18.150, 2); | |
DecimalPrecision44.floor(2.260, 2); | |
DecimalPrecision44.floor(18.150, 2); | |
DecimalPrecision44.floor(-9.130, 2); | |
DecimalPrecision44.floor(-65.180, 2); | |
DecimalPrecision44.trunc(2.260, 2); | |
DecimalPrecision44.trunc(18.150, 2); | |
DecimalPrecision44.trunc(-2.260, 2); | |
DecimalPrecision44.trunc(-18.150, 2); | |
DecimalPrecision44.round(1262.48, -1); | |
DecimalPrecision44.round(1262.48, -2); | |
}); | |
suite.on("cycle", function (evt) { | |
console.log(" - " + evt.target); | |
}); | |
suite.on("complete", function (evt) { | |
console.log(new Array(30).join("-")); | |
var results = evt.currentTarget.sort(function (a, b) { | |
return b.hz - a.hz; | |
}); | |
results.forEach(function (item) { | |
console.log((idx + 1) + ". " + item); | |
}); | |
}); | |
console.log("Decimal Rounding - Number.EPSILON vs Number.EPSILON v2 #jsbench"); | |
console.log(new Array(30).join("-")); | |
suite.run(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment