繁体   English   中英

浮点表示

[英]Floating point representation

什么决定了内存中浮点数的表示? 由编译器或FPU。 如果表示形式取决于FPU,则编译器如何在二进制文件中存储诸如1.337f之类的常量? 也许在应用程序启动时发生浮点值解包? 我一直对此问题感兴趣,因为需要进行网络编程。

C和C ++标准不需要任何特定的浮点表示形式,尽管最近的标准已包括对IEEE的某些特定支持(即,如果实现使用IEEE浮点,则可以使用这些功能)。 对于特定的实现(也称为工具链),浮点数的表示取决于主机系统,并且在某种程度上取决于编译器供应商的决策。

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

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

从历史上看,处理硬件已经以多种方式实现了浮点运算-有些是专有的,有些是标准化的。 有许多处理器支持多种不同的表示形式。 在某些情况下,软件层在完全不支持浮点的硬件之上模拟了浮点。 大多数编译器将使用硬件提供的浮点(如果有的话)(有些编译器具有选择不同浮点表示形式的选项,以反映其目标平台),但是许多针对硬件且不支持浮点支持的编译器会从字面上模拟软件中的表示形式和操作。

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

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

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

编译器如何在二进制文件中存储诸如1.337f之类的常量?

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

决定表示形式的是FPU,它遵循编译器支持的标准。

当前的标准是IEEE 754 它描述了浮点计算和数据应如何表示(有关详细说明,请参见本文 )。

数据始终由固定位数表示,例如32位,64位,128位,80位(也称为x86扩展精度)。 在内存中,它们几乎都是位。 但是然后,每组位代表浮点数据的组成部分,例如:最高位(取决于字节序 )是符号,另一组位是指数,另一位是有效部分。

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

因此, user2079303的答案是正确的:由谁来确定代码的表示形式是针对该标准的编译器,但是,如果不负责该标准,它将无法正常工作。

编辑: 彼得的答案很详细,涵盖了许多其他情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM