AVR 如何执行浮点运算
How does an AVR perform floating point Arithmetic
我正在尝试在没有 FPU 的 CPU 上实现对 double
和 float
的支持以及相应的基本算法。
我知道在所有 AVR ATmega controllers
上都是可能的。 ATmega 也没有 FPU。那么问题来了:它是如何工作的?如果对文献或带有解释和示例的链接有任何建议?
在最好的情况下,我会为这样的代码提供支持:
double twice ( double x )
{
return x*x;
}
非常感谢,
亚历克斯
这个 post 您可能会感兴趣:Floating point calculations in a processor with no FPU
如前所述:
Your compiler may provide support, or you may need to roll your own.
There are freely-available implementations, too.
如果是用于 ATmega,您可能不必自己编写任何东西。所有已经可用的库可能已经优化得比你自己做的要远得多。如果您需要更高的性能,您可以考虑将浮点数转换为定点数。无论如何你应该考虑这一点。如果你能在定点完成工作,你应该远离浮点。
Avr 使用 AVR Libc,您可以下载并检查。
有一个数学图书馆,但这不是您要找的。其中包含 math.h.
中定义的标准函数
相反,您需要执行乘法之类的函数。这些也在 Libc 中,在 fplib 下并用汇编语言编写。但是用户不会直接调用它们。相反,当编译器遇到涉及浮点数的乘法时,编译器会选择正确的函数插入。
您可以浏览 AVR fplib 以了解要做什么,但您将不得不为您的处理器编写自己的汇编代码或位运算代码。
您需要找出您的处理器和语言使用的浮点标准。 IEEE,也许?你还需要知道系统是小端还是大端。
我假设您的系统还没有 C 编译器。否则,所有的浮点运算都已经实现了。 “twice()
”函数(实际上是 square()
)可以正常工作。
以下是 AVR 相关链接,其中包含实现软替身的解释和示例:
- 你会找到一个双精度浮点库 here。
- 另一个可以在上一条消息中找到here.
- Double 非常慢,所以如果担心速度,您可以选择定点数学。请阅读我在 this thread:
中的消息
我正在尝试在没有 FPU 的 CPU 上实现对 double
和 float
的支持以及相应的基本算法。
我知道在所有 AVR ATmega controllers
上都是可能的。 ATmega 也没有 FPU。那么问题来了:它是如何工作的?如果对文献或带有解释和示例的链接有任何建议?
在最好的情况下,我会为这样的代码提供支持:
double twice ( double x )
{
return x*x;
}
非常感谢, 亚历克斯
这个 post 您可能会感兴趣:Floating point calculations in a processor with no FPU
如前所述:
Your compiler may provide support, or you may need to roll your own. There are freely-available implementations, too.
如果是用于 ATmega,您可能不必自己编写任何东西。所有已经可用的库可能已经优化得比你自己做的要远得多。如果您需要更高的性能,您可以考虑将浮点数转换为定点数。无论如何你应该考虑这一点。如果你能在定点完成工作,你应该远离浮点。
Avr 使用 AVR Libc,您可以下载并检查。
有一个数学图书馆,但这不是您要找的。其中包含 math.h.
中定义的标准函数相反,您需要执行乘法之类的函数。这些也在 Libc 中,在 fplib 下并用汇编语言编写。但是用户不会直接调用它们。相反,当编译器遇到涉及浮点数的乘法时,编译器会选择正确的函数插入。
您可以浏览 AVR fplib 以了解要做什么,但您将不得不为您的处理器编写自己的汇编代码或位运算代码。
您需要找出您的处理器和语言使用的浮点标准。 IEEE,也许?你还需要知道系统是小端还是大端。
我假设您的系统还没有 C 编译器。否则,所有的浮点运算都已经实现了。 “twice()
”函数(实际上是 square()
)可以正常工作。
以下是 AVR 相关链接,其中包含实现软替身的解释和示例:
- 你会找到一个双精度浮点库 here。
- 另一个可以在上一条消息中找到here.
- Double 非常慢,所以如果担心速度,您可以选择定点数学。请阅读我在 this thread: 中的消息