C语言 不带库的浮点操作



我正在寻找一种有效的方法来正确地使用浮动值进行数学运算。因为我是在嵌入式C中,我不想为float数据类型使用任何额外的库。

据我所知,这里的正确方法是将浮动值视为原始二进制(符号、指数、尾数),并执行类似的操作。但是我找不到任何例子来说明它是如何工作的。

我正在寻找一个关于如何在没有浮点数据类型的情况下做以下事情的解释:给定一个变量int x,其值从0到10000


y = x * 0.720 + 84.234;

y = y/2.5;感谢你的时间互联网

对于您建议的示例操作来说,不需要浮点库,虽然在没有FPU的嵌入式系统上避免浮点代码通常是可取的,但通过实现您自己的浮点编码来实现这一点将不会为您节省任何东西,并且可能比使用编译器的内置FP支持更低效率,更难以理解,更容易出错。

相反,您需要完全避免使用浮点代码,而使用定点编码。在许多情况下,可以为单个表达式特别完成,但如果您的应用程序是数学密集型的(例如涉及三角,对数,sqrt,幂),您可能会选择定点库

或实现您自己的 。浮点依赖在你建议的例子中是微不足道的根除;例如:

// y = x * 0.720 + 84.234
// Where x_x1000 = real value * 1000
int y_x1000 = (x_x1000 * 720) / 1000 + 84234 ;

或更有效地使用二进制定点和10位小数部分:

// y = x * 0.720 + 84.234
// Where x_q10 = real value * 1024
int32_t y_q10 = (x_q10 * 737) >> 10 + 86256 ;

尽管您可能会考虑int64_t用于更大的数字范围-在这种情况下,您也可能使用更多的小数位来获得更高的精度。

如果你正在做大量密集的定点数学,你最好考虑一个库或使用CORDIC算法实现一个库。在https://www.justsoftwaresolutions.co.uk/news/optimizing-applications-with-fixed-point-arithmetic.html上可以找到一个这样的库的例子,尽管它是c++ -明显的优势是通过定义fixed类和广泛的操作符重载,现有的浮点代码可以通过用fixed替换doublefloat关键字并编译为c++来很大程度上转换为定点-即使代码是非面向对象的,完全像C-

最新更新