Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不使用浮点寄存器的浮点常量(Linux内核模块)_C_Linux_Linux Kernel - Fatal编程技术网

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

C 不使用浮点寄存器的浮点常量(Linux内核模块),c,linux,linux-kernel,C,Linux,Linux Kernel,我开发了一个Linux内核模块,它需要使用浮点常量。我最近遇到了一个我需要处理的内核构建,它禁止对内核模块使用浮点寄存器 我所有的浮点操作都可以在编译时进行,我最终需要的就是在堆上有一个变量,它是特定浮点常量的内存二进制等价物(声明的变量类型是无关的)。例如: const float fval = 3.8 * 0.98 / 1000.0; const int * const iptr = (const int *)&fval; const int ival = *iptr; 这是令人费

我开发了一个Linux内核模块,它需要使用浮点常量。我最近遇到了一个我需要处理的内核构建,它禁止对内核模块使用浮点寄存器

我所有的浮点操作都可以在编译时进行,我最终需要的就是在堆上有一个变量,它是特定浮点常量的内存二进制等价物(声明的变量类型是无关的)。例如:

const float fval = 3.8 * 0.98 / 1000.0;
const int * const iptr = (const int *)&fval;
const int ival = *iptr;
这是令人费解的,但希望能澄清我试图实现的目标。基本上,我需要在编译期间执行这些步骤,以便在堆上有变量ival,但不会在编译代码中使用浮点寄存器

到目前为止,我的黑客解决方案是为我需要表示的各种浮点常量值运行上述代码,然后手动将它们的整数表示形式转录到我的模块代码中

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

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;

使用静态常量应该足以防止在运行时进行浮点计算。

作为一般准则:不要在内核代码中使用浮点。使用FP可以做的事情很少,没有FP就做不到。预处理器不能使用浮点。但是,您发布的C代码应该通过任何优化级别>0进行优化,以满足您的需要(没有寄存器和操作,只有初始化变量)。尝试并查看生成的assembly.XY问题。有一种简单而明显的方法可以在没有浮标的情况下相处。应用普通数学。该代码调用未定义的行为。堆上也没有分配任何东西。建议-将所有FP转换为整数,方法是将它们与某个常量相乘-例如上面的示例-380*98/1000提供的代码是伪代码。最后,我需要在堆上填充4个字节,当我处于可以将其用作浮点值的上下文中时,它将是一个特定的浮点值。浮点值是我的内核模块在“配置消息”中提供给用户空间程序的“配置值”。希望这能起到作用。感谢您将我对“预处理器”的使用解释为“运行时之前的任何时间”。好的,我已经验证了这正是我所需要的。我很惊讶(但不是很惊讶)发现,如果不“使用浮点寄存器”,我甚至无法进行浮点类型的赋值或复制。甚至“static const float val1=3.1415;float val2=val1;”之类的内容也不被允许。再次感谢!