2013-06-12 97 views
2

我試圖生成包含浮點文字的LLVM文本IR。爲了能夠可靠地工作,我需要能夠將浮點數轉換爲它們的十六進制文字表示。例如,這裏是結果應該是什麼:在Javascript中生成LLVM浮點十六進制文字

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

回答

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的預期後半部分的第一個和零。

1

什麼你正在試圖做的是轉儲雙重的二進制表示。以下是如何在C中完成的:

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

要在Javascript中執行此操作,您需要提取float的二進制表示形式。這是不平凡的,但幸運的是它似乎在這裏已經有#2的解決方案:Read/Write bytes of float in JS(具體而言,this answer看起來很方便)