【问题标题】:Floating point math on a processor that does not support it?不支持它的处理器上的浮点数学?
【发布时间】:2013-10-07 03:30:31
【问题描述】:

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

【问题讨论】:

标签: math floating-point processor


【解决方案1】:

在没有任何浮点硬件的系统中,CPU 使用一系列在整数算术逻辑单元上运行的更简单的定点算术运算来模拟它。

查看维基百科页面:Floating-point_unit#Floating-point_library,您可能会发现更多信息。

实际上模拟指令的不是 CPU。低端 CPU 的浮点运算由整数算术指令组成,编译器是生成这些指令的那个。基本上编译器(工具链)带有一个包含浮点函数的浮点库。

【讨论】:

    【解决方案2】:

    看看这篇文章: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 也是一个启示。

    【讨论】:

    • 泰勒级数逼近点附近的函数。 大多数情况下想要对区间进行统一精确的近似,这使得 Taylor 级数成为错误的工具。 lolengine.net/blog/2011/12/21/better-function-approximations
    • @PascalCuoq - 不错的补充。我同意这取决于要求是什么。并不是说我是泰勒级数的粉丝,对我来说,使用级数来逼近函数让我大开眼界。
    【解决方案3】:

    阅读http://www.worldofspectrum.org/documentation.html 上的“完整的 Spectrum ROM 反汇编”,查看 8 位 Z80 处理器上的浮点计算示例。

    对于正弦函数之类的东西,您可以预先计算一些值,然后使用 Chebyshev polynomials 进行插值。

    【讨论】:

      【解决方案4】:

      简短的回答是“慢慢地”。专门的硬件可以完成诸如提取不一定是字节对齐的比特组非常快速的任务。软件可以完成专用硬件可以完成的所有工作,但往往需要更长的时间才能完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-23
        • 2015-09-07
        • 2016-01-27
        • 2011-05-03
        相关资源
        最近更新 更多