在Linux内核模块中将long转换为float

4
这是我的第一个问题,我希望能在这里得到有用的答案或提示。
如标题所示:我需要在内核模块中从long转换为float,例如:78123456转换为78.123456,具体细节如下:
  1. 我有两个long变量(simple_strtol函数的输出),需要将它们转换为float(这是项目中必须完成的任务)。
  2. 指数固定为6(小数点后6位)。
  3. (atof)在内核空间不起作用。
  4. 我试过强制转换...但没有效果。
  5. 我试图将其乘以0.000001,但内核工作中不能进行浮点运算。
  6. 当然,我是用C编程语言编写的。
如果有任何方法可以做到,请尽快告诉我:
  • 如果有我不知道的函数(我认为没有),它是什么?
  • 如果有库中的函数,请告诉我如何下载此库以及如何包含它。
  • 如果还有其他方法,请告诉我。
非常感谢您提供的任何提示。

3
由于内核中不支持浮点数,那么对于你得到的浮点数,你打算如何处理?它是否真正需要是一个浮点数,或者只需要显示成一个浮点数即可? - user149341
2
由于内核空间在上下文切换期间处理FPU的方式,因此内核和浮点数是不可行的。 - Jesus Ramos
我的任务是从文本文件中获取纬度和经度,并将它们作为浮点数发送(必须)。我可以将数字(作为字符)复制到/proc文件中,然后读取它们,将它们从字符串转换为长整型(这就是simple_strtol所做的,我没有找到一个将其转换为浮点数的函数)。问题在于任务要求将它们作为浮点数发送。哦...但是主管告诉我可以使用浮点数的字节表示法...但对我来说不太清楚..:(另外一件事:声明一个浮点变量并发送它是可行的,但浮点运算不可用。非常感谢。 - Yacob
使用浮点数的字节表示法怎么样?对我来说,我对这项工作一无所知,我该怎么做呢? - Yacob
2个回答

1

这似乎根本不应该是内核模块。所描述的细节似乎应该是一个良好的应用程序的一部分,该程序格式化并发送UDP数据包。

如果这不可行,也许可以使用类似FUSE的方法?


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);

会做正确的事情。


啊,我看到问题已经更新了,所以我的假设是错误的。关于浮点数的字节表示,这里有一个起点:http://www.psc.edu/general/software/packages/ieee/ieee.php - Brian L
非常感谢您的帮助。
  • 但任务不是显示任何内容,我必须将经度和纬度坐标作为浮点数发送到IP数据报中。
  • 我已经从/proc文件中接收到“类似浮点字符串”的值(78.123456,但作为字符的字符串),因为我只能从/proc文件中获取字符串。
  • 如果我可以创建浮点缓冲区来从/proc文件中获取,我的问题就会得到解决。
  • 我还有另一种选择来处理浮点数的字节表示...但我不知道该怎么做。
- Yacob
我在阅读你的评论之前写了我的评论。 我现在会立刻查看链接。 非常感谢 :) - Yacob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接