【发布时间】:2013-10-07 03:30:31
【问题描述】:
如何在没有浮点单元的处理器上执行浮点数学运算?例如低端 8 位微控制器。
【问题讨论】:
-
看看avr-libc - 它使用整数数学来实现数学函数,并依赖编译器支持来操作浮点值。链接数学支持函数可能非常昂贵。
标签: math floating-point processor
如何在没有浮点单元的处理器上执行浮点数学运算?例如低端 8 位微控制器。
【问题讨论】:
标签: math floating-point processor
在没有任何浮点硬件的系统中,CPU 使用一系列在整数算术逻辑单元上运行的更简单的定点算术运算来模拟它。
查看维基百科页面:Floating-point_unit#Floating-point_library,您可能会发现更多信息。
实际上模拟指令的不是 CPU。低端 CPU 的浮点运算由整数算术指令组成,编译器是生成这些指令的那个。基本上编译器(工具链)带有一个包含浮点函数的浮点库。
【讨论】:
看看这篇文章: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++,但同时决定购买协处理器。
尤其是多项式算法和智能查找表;当你有正弦函数时,谁需要余弦或正切函数,这对考虑使用整数进行浮点运算有很大帮助。 Taylor series 也是一个启示。
【讨论】:
阅读http://www.worldofspectrum.org/documentation.html 上的“完整的 Spectrum ROM 反汇编”,查看 8 位 Z80 处理器上的浮点计算示例。
对于正弦函数之类的东西,您可以预先计算一些值,然后使用 Chebyshev polynomials 进行插值。
【讨论】:
简短的回答是“慢慢地”。专门的硬件可以完成诸如提取不一定是字节对齐的比特组非常快速的任务。软件可以完成专用硬件可以完成的所有工作,但往往需要更长的时间才能完成。
【讨论】: