bigfloat
Version:
Fast arbitrary precision math library for computational geometry.
67 lines (66 loc) • 2.29 kB
JavaScript
// This file is part of bigfloat, copyright (c) 2015- BusFaster Ltd.
// Released under the MIT license, see LICENSE.
import { BaseInfo32, limbSize32 } from './BaseInfo32';
/** Remove leading and trailing insignificant zero digits. */
export function trimNumber(str) {
return (str
.replace(/^(-?)0+([1-9a-z]|0(\.|$))/, '$1$2')
.replace(/(\.|(\.[0-9a-z]*[1-9a-z]))0+$/, '$2'));
}
/** Output EXACT value of an IEEE 754 double in any base supported by Number.toString.
* Exponent must be between -2 and 61, and last 3 bits of mantissa must be 0.
* Useful for debugging. */
export function numberToString(dbl, base) {
if (base === void 0) { base = 10; }
var _a = BaseInfo32.init(base), pad = _a.pad, limbBase = _a.limbBase;
var sign = '';
var out = '';
var limb;
var limbStr;
if (isNaN(dbl))
return ('NaN');
// For negative numbers, output sign and get absolute value.
if (dbl < 0) {
sign = '-';
dbl = -dbl;
}
if (!isFinite(dbl))
return (sign + 'Inf');
if (dbl < 1) {
out += '0';
}
else {
var iPart = Math.floor(dbl);
dbl -= iPart;
while (iPart) {
// Extract groups of digits starting from the least significant.
limb = iPart % limbBase;
iPart = (iPart - limb) / limbBase;
limbStr = limb.toString(base);
// Prepend digits to result.
out = limbStr + out;
// If more limbs remain, pad with zeroes to group length.
if (iPart)
out = pad.substr(limbStr.length) + out;
}
}
// Is there a fractional part remaining?
if (dbl > 0) {
out += '.';
if (limbBase != limbSize32) {
limbBase = base;
pad = '';
}
while (dbl) {
// Extract groups of digits starting from the most significant.
dbl *= limbBase;
limb = dbl >>> 0;
dbl -= limb;
limbStr = limb.toString(base);
// Append digits to result and pad with zeroes to group length.
out += pad.substr(limbStr.length) + limbStr;
}
}
// Remove trailing zeroes.
return (sign + out.replace(/(\.[0-9a-z]*[1-9a-z])0+$/, '$1'));
}