我正在尝试生成包含浮点文字的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
答案 0 :(得分:1)
您要做的是转储double的二进制表示。以下是它在C中的完成方式:
float f = ... // also works with double
char str[19];
sprintf(str, "0x%llX", f);
要在Javascript中执行此操作,您需要提取float的二进制表示。这不是微不足道的,但幸运的是,它似乎已经在Stackoverflow上有了一个解决方案:Read/Write bytes of float in JS(具体而言,this answer似乎很方便)
答案 1 :(得分: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调用后半部分。