不使用浮点寄存器的浮点常量(Linux内核模块)

我开发了一个Linux内核模块,它需要使用浮点常量。 我最近遇到了内核构build,我需要在内核模块上禁用浮点寄存器。

我的整个浮点操作可能是编译时间,最后我需要的只是在堆上有一个variables,这个variables是特定浮点常量的内存中二进制等价物 (声明的types为variables是无关紧要的)。 例如:

const float fval = 3.8 * 0.98 / 1000.0; const int * const iptr = (const int *)&fval; const int ival = *iptr; 

这是令人费解的,但希望澄清我试图完成。 基本上,我需要在编译过程中执行这些步骤,以便在堆中具有variablesival,但不会在编译代码中使用浮点寄存器。

到目前为止,我的解决scheme是运行上面的代码来获取我需要表示的各种浮点常量值,然后将其整数表示手动转录到我的模块代码中。

expression更清楚(是的,我真的需要在某种意义上使用浮点…我只需要避免在编译模块中使用浮点寄存器)。 假设我有:

 float val = 3.1415926; 

并假设它将被存储在内存中:0xDA0F4940

有没有办法让编译器填充0xDA0F4940的堆内存区域,而不编译在浮点运算?

如何使用这样的东西:

 union val { float fval; int ival; }; static const union val my_val1 = { .fval = 3.8 * 0.98 / 1000.0 }; int *vp = whatever; *vp = my_val1.ival; 

static const的使用应该足以防止运行时的浮点计算。