UNPKG

molstar

Version:

A comprehensive macromolecular library.

75 lines (74 loc) 2.27 kB
/** * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> * @author Alexander Rose <alexander.rose@weirdbyte.de> */ /** * Determine the number of digits in a floating point number * Find a number M such that round(M * v) - M * v <= delta. * If no such M exists, return -1. */ export function getMantissaMultiplier(v, maxDigits, delta) { var m = 1, i; for (i = 0; i < maxDigits; i++) { var mv = m * v; if (Math.abs(Math.round(mv) - mv) <= delta) return i; m *= 10; } return -1; } export function integerDigitCount(v, delta) { var f = Math.abs(v); if (f < delta) return 0; return Math.floor(Math.log10(Math.abs(v))) + 1; } /** * Determine the maximum number of digits in a floating point array. * Find a number M such that round(M * v) - M * v <= delta. * If no such M exists, return -1. */ export function getArrayDigitCount(xs, maxDigits, delta) { var mantissaDigits = 1; var integerDigits = 0; for (var i = 0, _i = xs.length; i < _i; i++) { if (mantissaDigits >= 0) { var t = getMantissaMultiplier(xs[i], maxDigits, delta); if (t < 0) mantissaDigits = -1; else if (t > mantissaDigits) mantissaDigits = t; } var abs = Math.abs(xs[i]); if (abs > delta) { var d = Math.floor(Math.log10(Math.abs(abs))) + 1; if (d > integerDigits) integerDigits = d; } } return { mantissaDigits: mantissaDigits, integerDigits: integerDigits }; } export function isInteger(s) { s = s.trim(); var n = parseInt(s, 10); return isNaN(n) ? false : n.toString() === s; } export function getPrecision(v) { if (!isFinite(v)) return 0; var e = 1; var p = 0; while (Math.round(v * e) / e !== v) { e *= 10; ++p; } return p; } export function toPrecision(v, precision) { return parseFloat(v.toPrecision(precision)); } export function toFixed(v, fractionDigits) { return parseFloat(v.toFixed(fractionDigits)); }