【问题标题】:How does an AVR perform floating point ArithmeticAVR 如何执行浮点运算
【发布时间】:2015-12-12 11:14:13
【问题描述】:

我正在尝试在没有 FPU 的 CPU 上实现对 doublefloat 的支持以及相应的基本算法。

我知道所有AVR ATmega controllers 都可以。 ATmega 也没有 FPU。那么问题来了:它是如何工作的?如果有任何文献建议或带有解释和示例的链接?

在最好的情况下,我会为这样的代码提供支持:

double twice ( double x )
{
  return x*x;
}

提前非常感谢, 亚历克斯

【问题讨论】:

  • 你需要一个浮点库。把它链接进去,你就得到了 FP 操作,就像 FP 硬件一样,只是更慢。
  • twice() 对于 squares 数字的函数是一个非常糟糕的选择。

标签: c floating-point avr


【解决方案1】:

以下是与 AVR 相关的链接,其中包含实现软双精度的解释和示例:

  1. 你会发现一个双浮点库here
  2. 在最后一条消息中可以找到另一个here
  3. Double 非常慢,因此如果担心速度,您可能会选择定点数学。请阅读我在 this thread 中的消息:

【讨论】:

    【解决方案2】:

    这篇文章可能会让你感兴趣:Floating point calculations in a processor with no FPU

    如前所述:

    您的编译器可能会提供支持,或者您可能需要自行开发。 也有免费提供的实现。

    如果是用于 ATmega,您可能不必自己编写任何东西。所有已经可用的库可能已经比您自己做的更进一步优化。如果您需要更高的性能,您可以考虑将浮点数转换为定点数。无论如何,您应该考虑这一点。如果你能在定点上完成工作,你应该远离浮点。

    【讨论】:

    • 它不适用于 ATmega。它适用于 Linux 内核模块。我需要做一些 fp 数学来正确设置设备。但是内核不支持 FPU 操作。您对定点的建议也可能是一种方式。有例子吗?
    • 内核修改不是我的专长,但这篇文章可能很有趣:stackoverflow.com/questions/13886338/… 如果你能用定点完成这项工作,你肯定应该这样做。我会搜索一个例子,一会儿。
    • 这篇文章可以帮你定点:stackoverflow.com/questions/79677/…
    • 我认为你是对的。将浮点实现集成到内核模块非常困难。所以我尝试在固定点完成工作。
    【解决方案3】:

    Avr 使用AVR Libc,您可以下载并查看。

    有一个数学库,但这不是您想要的。其中包含 math.h 中定义的标准函数。

    相反,您需要执行乘法之类的函数。这些也在 Libc 中,在 fplib 下并用汇编语言编写。但是用户不会直接调用它们。相反,当编译器遇到涉及浮点数的乘法时,编译器会选择正确的函数来插入。

    您可以浏览 AVR fplib 以了解要做什么,但您将不得不为您的处理器编写自己的程序集或位旋转代码。

    您需要了解您的处理器和语言对浮点使用的标准。 IEEE,也许?您还需要知道系统是小端还是大端。

    我假设您的系统还没有 C 编译器。否则,所有浮点运算都已经实现。那个“twice()”函数(实际上是square())可以正常工作。

    【讨论】:

    • OP 使用了一个极具误导性的名称;两次()实际上计算平方()。
    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多