如何在没有浮点单元的处理器上执行浮点数学运算?例如低端8位微控制器。
答案 0 :(得分: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 ++,但同时决定购买一个协处理器。
特别是多项式算法和智能查找表;当你有正弦函数时,谁需要余弦函数或tan函数,在考虑使用整数进行浮点运算时有很多帮助。 Taylor series也是一个启示。
答案 1 :(得分:3)
在没有任何浮点硬件的系统中,CPU使用在整数算术逻辑单元上运行的一系列更简单的定点算术运算来模拟它。
请查看维基百科页面:Floating-point_unit#Floating-point_library,因为您可能会找到更多信息。
实际上并不是模仿指令的cpu。低端cpu的浮点运算由整数算术指令构成,编译器是生成这些指令的编译器。基本上编译器(工具链)带有一个包含浮点函数的浮点库。
答案 2 :(得分:2)
简短的回答是“慢慢地”。专用硬件可以执行诸如提取不一定非常快速字节对齐的位组的任务。软件可以完成所有可以通过专用硬件完成的工作,但往往需要更长时间才能完成。
答案 3 :(得分:1)
在http://www.worldofspectrum.org/documentation.html读取“完整的Spectrum ROM反汇编”,以查看8位Z80处理器上的浮点计算示例。
对于像正弦函数这样的东西,你预先计算了几个值,然后使用Chebyshev polynomials进行插值。