2

我正在尝试生成包含浮点文字的 LLVM 文本 IR。为了让它可靠地工作,我需要能够将浮点数转换为它们的十六进制文字表示。例如,结果应该是这样的:

f2hex(0.0001)    -> "0x3F1A36E2E0000000"
f2hex(0.1)       -> "0x3FB99999A0000000"
f2hex(1.1)       -> "0x3FF19999A0000000"
f2hex(3.33333)   -> "0x400AAAA8E0000000"
f2hex(4.9)       -> "0x40139999A0000000"
f2hex(111.99998) -> "0x405BFFFFA0000000"

我会满足于对算法的详细描述(不依赖于 Javascript 中不可用的库或机器代码),但工作的 Javascript 代码更好。

LLVM 语言参考在此处描述了格式:http: //llvm.org/docs/LangRef.html#simple-constants

4

2 回答 2

1

我最终利用了IEEE-754 Floating-Point Conversion Page的源代码。我添加了以下两个功能:

function llvm_double_hex(input) {
  ieee64 = new ieee(64)
  ieee64.Dec2Bin(input.toString())
  ieee64.BinString =
    ieee64.Convert2Bin(ieee64.DispStr, ieee64.StatCond64, ieee64.Result[0],
                         ieee64.BinaryPower, false)
  return '0x' + ieee64.Convert2Hex()
};
function llvm_float_hex(input) {
  var d64 = llvm_double_hex(input);
  return d64.replace(/(.*)........$/, "$1A0000000");
};

第二个调用第一个并将后半部分归零,如 LLVM IR 预期的那样。

于 2013-11-02T21:26:56.840 回答
1

您要做的是转储双精度的二进制表示。下面是如何在 C 中完成它:

float f = ... // also works with double
char str[19];
sprintf(str, "0x%llX", f);

要在 Javascript 中执行此操作,您需要提取浮点数的二进制表示。这不是微不足道的,但幸运的是,在 Stackoverflow 上似乎已经有了一个解决方案:Read/Write bytes of float in JS(具体来说,这个答案似乎很方便)

于 2013-06-13T08:21:30.110 回答