当CPU没有(或有缺陷的)浮点单元时,软件如何执行浮点运算?例子包括PIC,AVR和8051微控制器架构。
当CPU没有(或有缺陷的)浮点单元时,软件如何执行浮点运算?例子包括PIC,AVR和8051微控制器架构。
浮点数只是以2为底的科学计数法。尾数和指数都是整数,softfloat库将把浮点部分操作分解成影响尾数和指数的操作,这些操作可以使用CPU整数支持。
例如,(x 2n) * (y 2m) = x * y 2n+m。
通常还需要规范化步骤来保持浮点表示规范,但可能可以在规范化之前执行多个操作。另外,由于IEEE-754使用偏置存储指数,因此必须考虑到这一点。
浮点数并非“模拟”。通常情况下,它们是按照IEEE754中所解释的方式存储的。
定点数是一种不同的实现类型。数字2.54可以使用定点数或浮点数来实现。
软件实现与FPU(浮点运算单元)
一些现代MCU,如ARM Cortex M4F,具有浮点运算单元,可以在硬件上比软件更快地执行浮点运算(如乘法、除法、加法)。
在8位MCU(如AVR、PIC和8051)中,操作仅在软件中完成(除法可能需要数百个操作)。它将分别处理尾数(小数部分)和指数部分以及所有特殊情况(例如NaN)。编译器通常有许多例程来处理相同的操作(例如除法),并根据优化(大小/速度)和其他参数(例如是否知道数字始终为正...)进行选择。
有一个另一个SO问题涵盖了C/C++标准对浮点数的要求。严格来说,浮点数可以以编译器喜欢的任何形式表示。但是实际上,如果您的浮点实现与IEEE754显著不同,则可以预期由于程序员习惯于IEEE754而导致许多错误。编译器必须友好于程序员,并且不应通过利用标准中未指定的位置来制造麻烦。因此,在大多数情况下,浮点数将以与所有其他架构(包括x86)相同的方式表示。固定点算术则完全不同。
在AVR和PIC的情况下,编译器知道没有可用的FPU,因此它将把每个单独的操作转换为CPU支持的一堆命令。它将必须将两个操作数归一化到公共指数,然后像整数一样在尾数上执行操作,然后调整指数。这是相当多的操作,因此模拟浮点数很慢。而且,除此之外,如果您优化大小,则每个浮点操作可能会变成函数调用。
而在ARM架构下,事情可能会非常奇怪。有带FPU的ARM处理器和没有FPU的ARM处理器。您可能希望拥有一个通用应用程序,可以在这两种类型的处理器上运行。在这种情况下,使用一个棘手(而且慢)的方案。应用程序使用FPU指令。如果您的CPU没有FPU,则该指令将触发中断,在其中操作系统将模拟该指令,清除错误位并将控制权返回给应用程序。但是,这个方案被证明非常缓慢,并且不常用。