Linux kernel linux内核模块中的长浮点转换

Linux kernel linux内核模块中的长浮点转换,linux-kernel,floating-point,Linux Kernel,Floating Point,这是我在这里的第一个问题,我希望我能在这里得到有用的答案或提示 正如标题所示:我需要在内核模块中从long转换为float,例如:78123456到78.123456,详细信息如下: 我有两个长变量(一个out of simple_strtol函数),我需要将它们转换为float(这是项目中的一项必需任务) 指数固定为6(浮点后有6个数字) (atof)在内核空间中不工作 我试着做演员,但没用 我尝试将其乘以0.000001,但在内核工作中无法使用浮点操作 当然,我在用C语言编程 如果有任何方法

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

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

  • 我有两个长变量(一个out of simple_strtol函数),我需要将它们转换为float(这是项目中的一项必需任务)
  • 指数固定为6(浮点后有6个数字)
  • (atof)在内核空间中不工作
  • 我试着做演员,但没用
  • 我尝试将其乘以0.000001,但在内核工作中无法使用浮点操作
  • 当然,我在用C语言编程
  • 如果有任何方法,请尽快告诉我:

    • 如果有一个我不知道的函数(我不认为有),它是什么
    • 如果有函数库,请告诉我如何下载该库以及如何包含它
    • 如果有其他方法也告诉我
    任何暗示都非常感谢


    非常感谢。

    我的假设是,您只想用小数点显示此变量(可能该变量测量的是微秒,您希望以秒为单位显示),而不是实际操作浮点变量(因为您已经指出浮点操作在内核空间中不可用)

    在这种情况下,不要将此问题视为从长整数到浮点的转换,而应将其视为字符串操作问题,尤其是因为对
    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.
    }
    

    将做正确的事情。

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


    如果这是不可行的,也许可以使用一种方法来代替?

    鉴于内核中没有浮点支持,您计划如何处理最终得到的浮点?(它实际上需要是浮点,还是只显示为浮点?)内核和浮点是不允许的,因为内核空间在上下文切换期间处理FPU的方式。我的任务是从文本文件中获取纬度和经度,并将它们作为浮点发送(强制)。我可以将数字(作为字符)复制到/proc文件,然后读取它们,将它们从字符串转换为长字符串(这就是simple_strtol所做的,我没有找到一个转换为浮点的函数)问题是任务是将它们作为浮点发送…但是主管告诉我,我可以使用浮点数的字节表示法…但对我来说还不够清楚(另一件事:声明一个浮点值并发送它是可用的,但浮点操作并不十分感谢。我对使用浮点数的字节表示法怎么办?我不知道这项工作,我怎么能这样做?啊,我看到问题已经更新,所以我的假设是错误的。对于字节表示法浮点数的表示,这里是一个起点:非常感谢-但任务不需要显示任何内容,我必须在IP数据报中发送经纬度坐标,作为浮点数。-我已经收到“类似浮点数的字符串”(78.123456,但作为字符串)中的值从/proc文件中,因为我只能从/proc文件中获取字符串。-如果我可以创建浮点缓冲区从/proc文件中获取,我的问题将得到解决。-我有另一个选择来处理浮点数字的字节表示…但我不知道如何处理。谢谢你的帮助。我在阅读你的评论之前写了我的评论,我将看到l现在就用墨水,非常感谢:)
    whole = val / 1e6;
    fraction = val - whole * 1e6;
    printf("%d.%06d", whole, fraction);