我试图找出如何在LLVM中写出非精确浮点数(例如1.3)。这就是documentation对它们所说的内容:
汇编程序需要浮点常量的精确十进制值。例如,汇编程序接受1.25但拒绝1.3,因为1.3是二进制的重复小数。
为了尝试这一点,我在C中编写了以下代码,并使Clang输出IR。
int main() {
float t = 0x3fa66666;
printf("%f\n", t);
}
// LLVM IR:
define i32 @main() #0 {
%t = alloca float, align 4
store float 0x41CFD33340000000, float* %t, align 4
%1 = load float* %t, align 4
%2 = fpext float %1 to double
%3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double %2)
ret i32 0
}
我在这里不明白的是0x41CFD33340000000来自何处以及如何计算?起初我只是认为它是一个双精度数,但是当我将其转换为32位IEEE-754浮点数时,我得到了0x4E7E999A。