linux内核模块中的long to float转换

时间:2011-09-16 03:15:55

标签: linux-kernel floating-point

这是我的第一个问题,我希望我能在这里获得有用的答案或提示。

正如它在标题中所示:我需要在内核模块中从long转换为float,例如:78123456到78.123456,详情如下:

  1. 我有两个长变量(simple_strtol函数的输出),我需要将它们转换为float(这是项目中的必需任务)。
  2. 指数固定为6(浮点后6个数字)。
  3. (atof)在内核空间不起作用。
  4. 我试图进行铸造......它不起作用。
  5. 我试图用0.000001计算它,但是在内核工作中没有浮点运算。
  6. 当然,我正在使用C编程语言。
  7. 如果有任何办法,请尽快告诉我:

    • 如果有一个我不知道的功能(我没有东西),那是什么?
    • 如果有一个函数库,请告诉我如何下载此库以及如何包含它。
    • 如果还有其他方法也告诉我。

    非常感谢任何提示。

    非常感谢。

2 个答案:

答案 0 :(得分:1)

这似乎不应该是一个内核模块。描述的花絮看起来好像是一个优秀的应用程序的一部分,它可以格式化和发送UDP数据包。

如果这不可行,也许可以使用FUSE-like方法代替?

答案 1 :(得分:0)

我的假设是你只想显示带有小数点的变量(可能变量测量微秒,你想以秒显示)而不是实际操作浮点变量(因为你已经指出了浮点数)内核空间中没有可用的操作。)

在这种情况下,不要将此问题视为从长整数到浮点的转换 - 而是将其视为字符串操作问题,尤其是因为您对strtol的输入是字符串。

在伪代码中,如果您的输入和输出是单独的字符串:

void insertDecimalPoint(char const * strSrc, char * strDest, int maxlength)
{
    1. find the length of strSrc
    2. if length <= 6, then write a prefix of zeros like '0.000' to strDest
       and then copy the source string to the destination
    3. else, copy the first (length - 6) digits, then add a decimal point '.',
       then copy the rest of the source to the destination.
}

或者,如果输入为长整数val,则为

之类的行
whole = val / 1e6;
fraction = val - whole * 1e6;
printf("%d.%06d", whole, fraction);

会做正确的事。