Skip to content

Instantly share code, notes, and snippets.

@dy
Last active December 27, 2024 18:08
Show Gist options
  • Save dy/6668ceab35c0a8eea8623e31f0c0c922 to your computer and use it in GitHub Desktop.
Save dy/6668ceab35c0a8eea8623e31f0c0c922 to your computer and use it in GitHub Desktop.
Float hex - create 0x1.abcp123 form from float number
// based on https://observablehq.com/@jrus/hexfloat
const flt_arr = new Float64Array([1]);
const int_arr = new Int32Array(flt_arr.buffer);
const SIGN_MASK = 0x7fffffff; // 0111 1111 1111 1111 1111 1111 1111 1111
const EXP_MASK = 0x7ff00000; // 0111 1111 1111 0000 0000 0000 0000 0000
// HI = 1 on little endian platforms, 0 on big-endian platforms.
const HI = 1, LO = 0;
const floathex = (x) => {
if (isNaN(x)) return `NaN`;
if (!isFinite(x)) return `${x < 0 ? '-' : '+'}Infinity`;
if (x === 0) return `${1/x < 0 ? '-' : '+'}0x0.0000000000000p+0000`;
flt_arr[0] = x;
// extract exponent, set exponent to 0
var exp = ((int_arr[HI] & EXP_MASK) >> 20) - 0x3ff;
if (exp == -1023) { // denormal
flt_arr[0] = x * 2 ** 1023;
exp += ((int_arr[HI] & EXP_MASK) >> 20) - 0x3ff;
}
int_arr[HI] = (int_arr[HI] & ~EXP_MASK) ^ 0x3ff00000;
// extract sign, set sign to 0
var minus = !!(int_arr[HI] & ~SIGN_MASK) ? '-' : '+';
int_arr[HI] = int_arr[HI] & SIGN_MASK;
var hex = flt_arr[0].toString(16) + ((flt_arr[0] === 1) ? '.' : '');
hex = (hex + '0000000000000').slice(0, 15);
var expstr = (exp >= 0 ? '+' : '-') + ('0000' + Math.abs(exp)).slice(-4);
return `${minus}0x${hex}p${expstr}`;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment