不支持浮点数运算的处理器上如何进行浮点数运算?

3
在没有浮点数单元的处理器上,如低端8位微控制器,如何执行浮点数运算?

1
请查看avr-libc - 它使用整数数学来实现数学函数,并依赖于编译器支持对浮点值进行操作。链接数学支持函数可能非常昂贵。 - Brett Hale
相关:https://dev59.com/BV_Va4cB1Zd3GeqPXdUO - Jeff Hammond
4个回答

4

请看这篇文章:http://www.edwardrosten.com/code/fp_template.html

(来自该文章)

首先,您需要考虑如何在内存中表示浮点数:

struct this_is_a_floating_point_number
{
    static const unsigned int mant = ???;
    static const int          expo = ???;
    static const bool         posi = ???;
};

然后你需要考虑如何使用这种表示进行基本计算。有些可能很容易实现,并且在运行时速度相当快(比如乘以或除以2)。
除法可能更难,例如可以使用牛顿迭代法来计算答案。
最后,在运行时,智能逼近和生成的表格值可能会加速计算。
多年前,C++模板帮助我在Intel 386 SX上进行浮点数计算。
最后我学到了很多数学和C++,但同时决定购买一个协处理器。
特别是多项式算法和智能查找表;当你有正弦函数时,谁需要余弦或正切函数,对于使用整数进行浮点算术思考很有帮助。泰勒级数也是一种启示。

1
泰勒级数近似函数在某一点附近。人们通常希望在一个区间内得到均匀精确的近似值,这使得泰勒级数成为不适合使用的工具。http://lolengine.net/blog/2011/12/21/better-function-approximations - Pascal Cuoq
1
@PascalCuoq - 很好的补充。我同意它取决于需求是什么。并不是说我喜欢泰勒级数,对我来说,这是一个用级数逼近函数的启示。 - Emond

3
在没有浮点硬件的系统中,CPU使用一系列更简单的定点算术运算来模拟它,这些运算在整数算术逻辑单元上运行。请参阅维基百科页面:Floating-point_unit#Floating-point_library,因为您可能会发现更多信息。实际上,并不是 CPU 来模拟指令。低端 CPU 的浮点运算是由整数算术指令组成的,编译器是生成这些指令的工具。基本上,编译器(工具链)带有包含浮点函数的浮点库。

2

简短的回答是“慢慢地”。专门的硬件可以非常快速地执行提取未必以字节对齐的位组等任务。软件可以做到专门硬件所能做到的一切,但往往需要更长的时间来完成。


1

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