/* * lib/decmath.js - Fast and light decimal math * * @licstart The following is the entire license notice for the * JavaScript code in this file. * * Copyright (C) 2017 Libiquity LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * As additional permission under GNU GPL version 3 section 7, you * may distribute non-source (e.g. minimized or compacted) forms of * this program without the copy of the GNU GPL normally required by * section 4, provided you include this license notice and a URL * through which recipients can access the Corresponding Source. * * @licend The above is the entire license notice * for the JavaScript code in this file. */ "use strict"; function dadd(a, b) { a = a.toString().split(".", 2); b = b.toString().split(".", 2); if (typeof a[1] == "undefined") a[1] = ""; if (typeof b[1] == "undefined") b[1] = ""; var ce; if (a[1].length == b[1].length) { ce = a[1].length; } else if (a[1].length < b[1].length) { a[1] += Array(b[1].length - a[1].length + 1).join("0"); ce = b[1].length; } else { b[1] += Array(a[1].length - b[1].length + 1).join("0"); ce = a[1].length; } var as = a[0] + a[1]; var bs = b[0] + b[1]; var cs = (parseInt(as, 10) + parseInt(bs, 10)).toString(); var pad = ce - cs.length; if (pad > 0) cs = (Array(pad + 1).join("0") + cs).toString(); return cs.substr(0, cs.length - ce) + "." + cs.substr(cs.length - ce); } function dmul(a, b) { a = a.toString().split(".", 2); b = b.toString().split(".", 2); if (typeof a[1] == "undefined") a[1] = ""; if (typeof b[1] == "undefined") b[1] = ""; var as = a[0] + a[1]; var bs = b[0] + b[1]; var cs = (parseInt(as, 10) * parseInt(bs, 10)).toString(); var ce = a[1].length + b[1].length; var pad = ce - cs.length; if (pad > 0) cs = (Array(pad + 1).join("0") + cs).toString(); return cs.substr(0, cs.length - ce) + "." + cs.substr(cs.length - ce); } function drhtz(a, p) { a = a.toString().split(".", 2); if (a.length == 1) return null; var ad = a[1].substr(p); a[1] = a[1].substr(0, p); var as = a.join(""); if (as.charAt(0) != "-") { if (parseInt(ad, 10) > 5 * Math.pow(10, ad.length - 1)) { as = (parseInt(as) + 1).toString(); } } else { if (parseInt(ad, 10) > 5 * Math.pow(10, ad.length - 1)) { as = (parseInt(as) - 1).toString(); } } var pad = p - as.length; if (pad > 0) as = (Array(pad + 1).join("0") + as).toString(); return as.substr(0, as.length - p) + "." + as.substr(as.length - p); } function drhfz(a, p) { a = a.toString().split(".", 2); if (a.length == 1) return null; var ad = a[1].substr(p); a[1] = a[1].substr(0, p); var as = a.join(""); if (as.charAt(0) != "-") { if (parseInt(ad, 10) >= 5 * Math.pow(10, ad.length - 1)) { as = (parseInt(as) + 1).toString(); } } else { if (parseInt(ad, 10) >= 5 * Math.pow(10, ad.length - 1)) { as = (parseInt(as) - 1).toString(); } } var pad = p - as.length; if (pad > 0) as = (Array(pad + 1).join("0") + as).toString(); return as.substr(0, as.length - p) + "." + as.substr(as.length - p); } function dfmt(a, p) { a = a.toString().split(".", 2); if (a.length == 1) return null; if (a[0] == "") a[0] = "0"; if (a[0] == "-") a[0] = "-0"; if (a[1].length < p) a[1] += Array(p - a[1].length + 1).join("0"); return a.join("."); } if (typeof global != "undefined") { global.dadd = dadd; global.dmul = dmul; global.drhtz = drhtz; global.drhfz = drhfz; global.dfmt = dfmt; }