浮点表示

时间:2016-04-24 12:06:01

标签: c++ serialization

什么决定了内存中浮点数的表示?由编译器或FPU。 如果表示依赖于FPU,编译器如何将常量(例如1.337f)存储在二进制文件中?也许当应用程序启动时解压缩浮点值? 我一直对这个问题感兴趣,因为做网络编程。

3 个答案:

答案 0 :(得分:2)

C和C ++标准不需要任何特定的浮点表示,尽管最近的标准包括对IEEE的一些特定支持(即,如果实现使用IEEE浮点,则可用的设施)。对于特定的实现(也就是工具链),浮点的表示取决于主机系统,在某种程度上取决于编译器供应商的决策。

对于较旧的微处理器(以及其他处理硬件,如微控制器,数字信号处理器[DSP]等),实现通常是硬件实现 - 例如,一组专用电子电路实现表示浮点值的寄存器,以及对这些寄存器进行操作的电路。

在现代处理硬件(微控制器,DSP,图形处理单元,浮点单元等)中,实现是微码 - 过于简单化,实现机器代码指令的硬件指令层和状态机(就程序和操作系统而言,处理器似乎如何工作)。因此,可执行程序和操作系统使用更高级别的指令集(X86等),并且微代码是操作系统和硬件之间的中介(通常实现非常简单的指令集)。本说明书中的术语“现代”是相对的 - 第一个基于微码的处理器可以追溯到20世纪70年代。

历史上,处理硬件已经以多种方式实现了浮点 - 一些是专有的,一些是标准化的。有许多处理器支持多种不同的表示。在某些情况下,软件层在硬件顶部模拟了浮点,根本不支持浮点。大多数编译器将使用硬件提供的浮点(如果可用)(并且一些编译器可以选择不同的浮点表示,反映其目标平台),但许多针对没有浮点支持的硬件的编译器实际上模拟软件中的表示和操作

IEEE浮点规范(1985年第一版,最新版本IEEE 754-2008)已被采纳为国际标准ISO / IEC / IEEE 60559:2011定义了许多东西,包括算术格式(如何值,无穷大,NaN等以浮点变量表示,交换格式(系统之间交换浮点值的编码),操作(算术等),操作期间的舍入规则和异常处理(处理类似的事情)被零除)。 IEEE规范已经发展了一段时间,并且在现代硬件和软件中变得越来越普遍。

答案 1 :(得分:0)

  

什么决定了内存中浮点数的表示

编译器确定它使用的表示形式。但是,如果它以fpu为目标,那么它必须使用fpu使用的表示。

  

编译器如何将常量(例如1.337f)存储在二进制文件中?

通常,与在内存中使用的二进制表示相同。

答案 2 :(得分:0)

谁确定表示是符合编译器支持的标准的FPU。

目前的标准是 IEEE 754 。它描述了如何表示浮点计算和数据(有关详细说明,请参阅this article)。

数据总是由固定的位数表示,例如32位,64位,128位,80位(a.k.a x86扩展精度)。在记忆中,他们只是比特。但是,每组位表示浮点数据的一个组成部分,例如:最高位(取决于字节序)是符号,另一组位是指数,另一组是指数重要的部分。

然后,编译器对标准的支持( IEEE 754 )会生成特定于该表示的代码。

所以,user2079303的答案是正确的:谁确定代码的表示形式是针对标准的编译器,但是如果标准不负责则它将不起作用。

编辑:Peter的答案非常详细,涵盖了许多其他案例。