如何在FPU和SSE发明之前处理浮点转换?

时间:2014-12-27 00:20:46

标签: c assembly x86 sse fpu

我试图了解如何在低级别处理浮点转换。所以根据我的理解,这是在硬件中实现的。因此,例如,SSE提供指令cvttss2si,它将float转换为int。

但我的问题是:浮点转换总是以这种方式处理吗?在FPU和SSE发明之前,使用汇编代码手动完成计算?

8 个答案:

答案 0 :(得分:3)

这取决于处理器,多年来一直有巨大数量的不同处理器。

FPU代表"浮点单元"。它或多或少是通用术语,可以指任何计算机系统的浮点硬件单元。某些系统可能在CPU中内置了浮点运算。其他人可能有一个单独的芯片。然而其他人可能根本没有硬件浮点支持。如果在代码中指定浮点转换,编译器将生成执行必要计算所需的任何CPU指令。在某些系统上,这可能是对子程序的调用,该子程序需要进行任何位操作。

SSE代表" Streaming SIMD Extensions",并且特定于x86系列CPU。对于非x86 CPU,没有#34;之前"或"之后" SSE; SSE根本不适用。

答案 1 :(得分:1)

从浮点到整数的转换被认为是一个基本的操作,387指令集已经有了这样的指令FIST - 虽然对编译C程序的(int)f结构没有用,因为该指令使用了当前的舍入模式。

一些RISC指令集始终认为从浮点到整数的专用转换指令是不必要的奢侈,并且这可以通过访问IEEE 754浮点表示的若干指令来完成。一个基本方案可能看起来像this blog post,尽管博客文章是关于将浮点数舍入到 float表示最接近的整数。

答案 2 :(得分:1)

在IEEE 754算法标准化之前,有许多竞争供应商特定的浮点运算方法。对于溢出,下溢,带符号的零和未定义的结果(如0/0或sqrt(-1)),它们具有不同的范围,精度和不同的行为。

但是,您可以将浮点实现划分为两个基本组:硬件和软件。在硬件中,您通常会看到执行转换的操作码,尽管协处理器FPU可能会使事情变得复杂。在软件中,转换将由函数完成。

今天,仍有软FPU,主要是在嵌入式系统上。不久前,这在移动设备中很常见,但软FPU仍然是小型系统的常态。

答案 3 :(得分:1)

这取决于编译器的实现。您可以使用几乎任何语言实现浮点数学运算(C:http://www.jhauser.us/arithmetic/SoftFloat.html中的示例),因此通常编译器的运行时库将包含浮点数学(或可能是目标硬件始终支持本机指令 - 再次,取决于硬件),并且作为优化提供针对FPU或使用SSE的指令。

答案 4 :(得分:1)

实际上,浮点运算对硬件工程师来说是一个挑战,因为它们需要大量硬件(导致最终产品的成本较高)并消耗大量电力。有些架构不包含浮点单元。还存在即使对于整数除法等基本操作也不提供指令的体系结构。 ARM体系结构就是一个例子,您必须在软件中实现除法。此外,浮点单元作为该架构中的可选协处理器。考虑到ARM是嵌入式系统中使用的主要架构,值得考虑这一点。

IEEE 754(大多数应用程序中使用的浮点标准)并不是表示实数的唯一方法。您也可以使用定点格式表示它们。例如,如果您有一台32位机器,您可以假设您在第15位和第16位之间有一个小数点,并执行操作时要记住这一点。这是表示浮点数的简单方法,可以在软件中轻松处理。

答案 5 :(得分:1)

在浮点数之前并不真正适用,因为有些最早的计算机是在1940年支持的浮点数中生成的:wiki - first electro mechanical computers

在没有浮点硬件的处理器上,浮点运算在软件中或在某些计算机上以微码实现,而不是完全硬件实现:wiki - microcode,或者操作可以由单独的硬件组件处理例如Intel x87系列:wiki - x87

答案 6 :(得分:1)

  

但我的问题是:浮点转换总是以这种方式处理吗?

不,除了x86之外,架构上没有x87或SSE,所以没有cvttss2si

你可以用软件做的一切,你也可以用硬件做,反之亦然。

浮动转换相同。如果您没有硬件支持,只需做一些黑客攻击。这里没有任何低级别,因此您可以轻松地使用C语言或任何其他语言。在SO

上已经有很多解决方案

答案 7 :(得分:0)

是。通过移动尾数将指数改为0,使数字非规范化。如果结果对于int来说太大,则会生成异常。否则,非规范化数字(减去派系部分和可选的舍入)是等价整数。