【问题标题】:Generate LLVM floating point hex literals in Javascript在 Javascript 中生成 LLVM 浮点十六进制文字
【发布时间】:2013-06-08 23:16:53
【问题描述】:

我正在尝试生成包含浮点文字的 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

【问题讨论】:

    标签: javascript floating-point type-conversion llvm


    【解决方案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(具体来说,this answer 似乎很方便)

    【讨论】:

      【解决方案2】:

      我最终利用了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 预期的那样。

      【讨论】:

        猜你喜欢
        • 2014-10-31
        • 1970-01-01
        • 2014-02-26
        • 2018-08-19
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 2018-03-08
        • 2011-12-05
        相关资源
        最近更新 更多