const numbers = [
-100,
100,
1000000,
-1000000,
-833104355893312,
1903318398499,
612220539711103,
-7158314534396895,
4426161736746491,
-1550.65324,
2316998423414107,
-351139018211.5476,
3064775428585727.13434,
6176764689210239,
3.141592653589793
]
// https://stackoverflow.com/a/30690986/1742070
function numberParts(x, b = 10) {
var exp = 0
var sgn = 0
if (x === 0) return { sign: 0, mantissa: 0, exponent: 0 }
if (x<0) sgn=1, x=-x
while (x>b) x/=b, exp++
while (x<1) x*=b, exp--
return { sign: sgn, mantissa: x, exponent: exp }
}
numbers.forEach(number => numberParts(number, 10))
// https://stackoverflow.com/a/11148451/1742070
function decodeIEEE64 ( value ) {
if ( typeof value !== "number" )
throw new TypeError( "value must be a Number" );
var result = {
isNegative : false,
exponent : 0,
mantissa : 0
};
if ( value === 0 ) {
return result;
}
// not finite?
if ( !isFinite( value ) ) {
result.exponent = 2047;
if ( isNaN( value ) ) {
result.isNegative = false;
result.mantissa = 2251799813685248; // QNan
} else {
result.isNegative = value === -Infinity;
result.mantissa = 0;
}
return result;
}
// negative?
if ( value < 0 ) {
result.isNegative = true;
value = -value;
}
// calculate biased exponent
var e = 0;
if ( value >= Math.pow( 2, -1022 ) ) { // not denormalized
// calculate integer part of binary logarithm
var r = value;
while ( r < 1 ) { e -= 1; r *= 2; }
while ( r >= 2 ) { e += 1; r /= 2; }
e += 1023; // add bias
}
result.exponent = e;
// calculate mantissa
if ( e != 0 ) {
var f = value / Math.pow( 2, e - 1023 );
result.mantissa = Math.floor( (f - 1) * Math.pow( 2, 52 ) );
} else { // denormalized
result.mantissa = Math.floor( value / Math.pow( 2, -1074 ) );
}
return result;
}
numbers.forEach(number => decodeIEEE64(number))
// https://stackoverflow.com/a/17156580/1742070
function getNumberParts(x)
{
var float = new Float64Array(1),
bytes = new Uint8Array(float.buffer);
float[0] = x;
var sign = bytes[7] >> 7,
exponent = ((bytes[7] & 0x7f) << 4 | bytes[6] >> 4) - 0x3ff;
bytes[7] = 0x3f;
bytes[6] |= 0xf0;
return {
sign: sign,
exponent: exponent,
mantissa: float[0],
}
}
numbers.forEach(number => getNumberParts(number))
// https://stackoverflow.com/a/53980679/1742070
function numberSplit(number) {
const [mantissa, exponent] = number.toExponential().split("e");
return parseFloat(mantissa), parseInt(exponent)
}
numbers.forEach(number => numberSplit(number))