converter.cjs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.convertToNumber = convertToNumber;
  6. exports.roundToFloat16Bits = roundToFloat16Bits;
  7. var _primordials = require("./primordials.cjs");
  8. const buffer = new _primordials.NativeArrayBuffer(4);
  9. const floatView = new _primordials.NativeFloat32Array(buffer);
  10. const uint32View = new _primordials.NativeUint32Array(buffer);
  11. const baseTable = new _primordials.NativeUint32Array(512);
  12. const shiftTable = new _primordials.NativeUint32Array(512);
  13. for (let i = 0; i < 256; ++i) {
  14. const e = i - 127;
  15. if (e < -27) {
  16. baseTable[i] = 0x0000;
  17. baseTable[i | 0x100] = 0x8000;
  18. shiftTable[i] = 24;
  19. shiftTable[i | 0x100] = 24;
  20. } else if (e < -14) {
  21. baseTable[i] = 0x0400 >> -e - 14;
  22. baseTable[i | 0x100] = 0x0400 >> -e - 14 | 0x8000;
  23. shiftTable[i] = -e - 1;
  24. shiftTable[i | 0x100] = -e - 1;
  25. } else if (e <= 15) {
  26. baseTable[i] = e + 15 << 10;
  27. baseTable[i | 0x100] = e + 15 << 10 | 0x8000;
  28. shiftTable[i] = 13;
  29. shiftTable[i | 0x100] = 13;
  30. } else if (e < 128) {
  31. baseTable[i] = 0x7c00;
  32. baseTable[i | 0x100] = 0xfc00;
  33. shiftTable[i] = 24;
  34. shiftTable[i | 0x100] = 24;
  35. } else {
  36. baseTable[i] = 0x7c00;
  37. baseTable[i | 0x100] = 0xfc00;
  38. shiftTable[i] = 13;
  39. shiftTable[i | 0x100] = 13;
  40. }
  41. }
  42. function roundToFloat16Bits(num) {
  43. floatView[0] = num;
  44. const f = uint32View[0];
  45. const e = f >> 23 & 0x1ff;
  46. return baseTable[e] + ((f & 0x007fffff) >> shiftTable[e]);
  47. }
  48. const mantissaTable = new _primordials.NativeUint32Array(2048);
  49. const exponentTable = new _primordials.NativeUint32Array(64);
  50. const offsetTable = new _primordials.NativeUint32Array(64);
  51. for (let i = 1; i < 1024; ++i) {
  52. let m = i << 13;
  53. let e = 0;
  54. while ((m & 0x00800000) === 0) {
  55. m <<= 1;
  56. e -= 0x00800000;
  57. }
  58. m &= ~0x00800000;
  59. e += 0x38800000;
  60. mantissaTable[i] = m | e;
  61. }
  62. for (let i = 1024; i < 2048; ++i) {
  63. mantissaTable[i] = 0x38000000 + (i - 1024 << 13);
  64. }
  65. for (let i = 1; i < 31; ++i) {
  66. exponentTable[i] = i << 23;
  67. }
  68. exponentTable[31] = 0x47800000;
  69. exponentTable[32] = 0x80000000;
  70. for (let i = 33; i < 63; ++i) {
  71. exponentTable[i] = 0x80000000 + (i - 32 << 23);
  72. }
  73. exponentTable[63] = 0xc7800000;
  74. for (let i = 1; i < 64; ++i) {
  75. if (i !== 32) {
  76. offsetTable[i] = 1024;
  77. }
  78. }
  79. function convertToNumber(float16bits) {
  80. const m = float16bits >> 10;
  81. uint32View[0] = mantissaTable[offsetTable[m] + (float16bits & 0x3ff)] + exponentTable[m];
  82. return floatView[0];
  83. }