Floating point 如何在软件中模拟浮点操作?

Floating point 如何在软件中模拟浮点操作?,floating-point,embedded,fpu,Floating Point,Embedded,Fpu,当CPU没有(或有缺陷)浮点单元时,软件如何执行浮点运算?例如PIC、AVR和8051微控制器架构。浮点不是“模拟的”。一般来说,它们是按照中的说明存储的 定点是另一种实现类型。数字2,54可以用定点或浮点实现 软件实现与FPU(浮点单元) 一些现代MCU,如ARM cortex M4F有一个浮点单元,可以在硬件中对浮点运算(如乘法、除法、加法)进行点阵,速度比软件快得多 在8位MCU(如AVR、PIC和8051)中,操作仅在软件中完成(一个分区可能需要数百次操作)。它必须分别穿行尾数(分数)部

当CPU没有(或有缺陷)浮点单元时,软件如何执行浮点运算?例如PIC、AVR和8051微控制器架构。

浮点不是“模拟的”。一般来说,它们是按照中的说明存储的

定点是另一种实现类型。数字2,54可以用定点或浮点实现

软件实现与FPU(浮点单元)

一些现代MCU,如ARM cortex M4F有一个浮点单元,可以在硬件中对浮点运算(如乘法、除法、加法)进行点阵,速度比软件快得多


在8位MCU(如AVR、PIC和8051)中,操作仅在软件中完成(一个分区可能需要数百次操作)。它必须分别穿行尾数(分数)部分和指数部分以及所有特殊情况(例如NaN)。编译器通常有许多例程来威胁同一个操作(例如除法),并且会根据优化(大小/速度)和其他参数(例如,如果知道数字总是正数…)进行选择。

浮点仅是base-2中的科学符号。尾数和指数都是整数,softfloat库将浮动部分操作分解为影响尾数和指数的操作,这可以使用CPU整数支持

例如,(x2n)*(y2m)=x*y2n+m

通常还需要一个规范化步骤来保持浮点表示的规范性,但在规范化之前可能会执行多个操作。此外,由于IEEE-754存储指数时带有偏差,因此必须考虑到这一点。

有一个标准涵盖了C/C++标准对浮点数的要求。所以,严格来说,浮点可以表示为编译器喜欢的任何形式。但实际上,如果您的浮点实现与IEEE754有很大的不同,那么您可能会看到由使用IEEE754的程序引起的大量错误。而且编译器必须是程序员友好的,并且不应该在利用未指定的标准位置时制造麻烦。因此,在大多数情况下,浮点数的表示方式与所有其他体系结构(包括x86)上的表示方式相同。定点算法太不一样了

在AVR和PIC的情况下,编译器知道没有可用的fpu,所以它会将每个操作转换为CPU支持的一组命令。它必须将两个操作数规格化为一个公共指数,然后对尾数执行与整数类似的运算,然后调整指数。这是相当多的操作,所以模拟的浮点运算速度很慢。除此之外,如果您对大小进行优化,则每个浮点操作都可能成为函数调用

在臂弓上,事情可能会很奇怪。有带FPU和不带FPU的ARM。您可能希望有一个通用的应用程序,它将在这两个平台上运行。在这种情况下,有一个棘手的(缓慢的)计划。应用程序使用FPU命令。如果您的CPU没有FPU,那么这样的命令将触发一个中断,操作系统将模拟该指令,清除错误位并将控制权返回给应用程序。但该方案的速度很慢,而且不常用

在PIC、AVR和8051的上下文中,“仿真”是错误的术语。浮点仿真是指在具有FPU选项但并非所有部件都包含FPU的体系结构上对FPU硬件进行仿真。这允许包含浮点指令的二进制文件在没有FPU的变体上运行。在使用时,FPU仿真作为无效指令异常处理程序实现;当遇到FPU指令但不存在FPU时,会发生异常,处理程序读取指令值并在软件中执行操作


但是,您列出的体系结构中没有一个定义FPU或FPU指令,因此没有什么可仿真的。相反,在这些情况下,浮点操作完全是在软件中实现的,编译器会根据需要生成代码来调用浮点例程。例如表达式
x=y*z
将生成相当于函数调用的代码
x=_fmul(y,z)。事实上,如果您查看包含浮点操作的生成的链接器映射输出,您可能会看到例程符号名称,如
\u fmul
\u fdiv
等-这些函数是编译器固有的。

“仿真的”?在X86/64 CPU上根本没有。你想要什么拱门?我说的是照片,AVR,8051微控制器。这发生在你告诉我们拱门之前。理想情况下,你应该在问题本身中包含这些信息。@deviantfan:对于任何听说过“硬浮动”和“软浮动”的人来说,很明显他说的是后者。如果您知道它属于这两类中的哪一类,那么确切的体系结构并不重要。此外,人们确实会在x86上模拟浮点运算,例如,以避免出现错误。@BenVoigt:您的加密示例不是模拟;也不是PIC、AVR或8051上的任何FP实现;这两种方法都没有定义FPU,也没有FPU指令,因此没有什么可仿真的。仿真用于定义FPU但FPU可能不存在的体系结构,以便在缺少FPU的目标上处理包含FPU指令的二进制文件。因此,根据定义,您不能在这些体系结构上模拟FPU;您只能实现浮点操作。实现不是仿真。我使用了软件IEEE754库。“软浮点”通常被称为浮点协处理器电路的“仿真”。@BenVoigt你认为有人总是使用FPU,我更习惯8位MCU(对我来说,HW浮点是“特殊的”