我试图了解如何在低级别处理浮点转换。所以根据我的理解,这是在硬件中实现的。因此,例如,SSE提供指令cvttss2si
,它将float转换为int。
但我的问题是:浮点转换总是以这种方式处理吗?在FPU和SSE发明之前,使用汇编代码手动完成计算?
答案 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)
答案 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来说太大,则会生成异常。否则,非规范化数字(减去派系部分和可选的舍入)是等价整数。