【发布时间】:2021-09-25 00:18:27
【问题描述】:
我正在编写 sysfs 相关的 Linux 设备驱动程序代码。 我对如何处理变量的浮动操作感到困惑。 是否有任何函数可用于处理浮点操作或者任何人都知道在 Linux 内核设备驱动程序中处理浮点操作的最佳方法?
我正在编写一个功率/电流/电压测量驱动程序,它在 sysfs 文件中提供输出。
代码:
volts /= 27500.0;
volts *= 250;
volts /= 1000;
有这样的操作我想在内核部分处理,浮点值应该是准确的。
【问题讨论】:
-
询问“最好的方法”将导致基于意见的答案,这将是题外话。此外,术语“处理浮点值”或“处理浮点操作”过于宽泛。您应该edit您的问题并添加有关您的特定问题的详细信息。你到底想用浮点值做什么?您指的是什么浮动操作?您具体需要哪些帮助?在设备驱动程序中添加一些你(认为你)为什么需要浮点值的背景信息也可能有助于理解你的问题。
-
您的示例应该可以通过定点数学轻松实现。即使是 32 位值 (16.16) 也应该为您提供足够的精度来涵盖 mV 到 kV。但我猜你是在 64 位平台上工作,所以甚至加倍。
-
用
millivolts = volts / 110;代替volts /= 27500.0; volts *= 250; volts /= 1000;(因为250/275000 = 1/110)然后scnprintf(buf, PAGE_SIZE, "%d.%03u", millivolts/1000, (millivolts < 0 ? (unsigned int)(-millivolts) : (unsigned int)(millivolts)) % 1000);。如果volts永远不会是负数,那么scnprintf(buf, PAGE_SIZE, "%u.%03u", millivolts/1000, millivolts%1000);就可以了。 (这里假设buf是一个页面,像往常一样具有 sysfs 属性。)