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

最佳答案

您想要做的是转储double的二进制表示形式。这是可以在C中完成的方法:

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


为此,您需要提取浮点数的二进制表示形式。这并不简单,但幸运的是,它似乎已经在Stackoverflow上找到了解决方案:Read/Write bytes of float in JS(特别是this answer似乎很方便)

08-16 07:33