2012-08-25 34 views
3

我知道在C/Java中,浮点数的底层表示是IEEE754-32,双点是IEEE754-64。浮动变量是如何自动提升为double类型的?

在表达式操作中,浮点数将被自动提升为double。又怎样?例如,以3.7f为例。这样的过程是什么?

  1. 3.7f将在使用IEEE754的存储器中表示。它适合它4个字节。
  2. 在计算过程中,它可能会被加载到一个64位寄存器(或任何64位的地方), 将3.7f转换为IEEE754-64所代表。

回答

4

这是非常依赖实施的。

例如,在x86平台上,该组FPU命令包括用于以IEEE754 floatdouble格式(以及许多其他格式)加载/存储数据的命令。数据被加载到具有80位宽度的内部FPU寄存器中。所以在x86上实际上所有的浮点计算都是以80位的浮点精度执行的。即所有浮点数据实际上被提升为80位精度。在这些寄存器内表示的数据如何是完全不相关的,因为无论如何你都无法直接观察它们。

这意味着在x86平台上不存在单步浮点到双精度转换的情况。无论何时出现这种转换需求,它实际上都实现为两步转换:浮点到内部fpu和内部fpu到双精度。

该BTW在x86 FPU计算模型和C/C++计算模型之间创建了显着的语义差异。为了完全匹配语言模型,处理器必须有效降低中间浮点结果的精度,从而对性能产生负面影响。许多编译器为用户提供了控制FPU计算模型的选项,允许用户选择严格的C/C++一致性,更好的性能或两者之间的选择。

不那么多年前FPU单元是一个可选 x86平台的组件。无FPU平台上的浮点计算是在软件中进行的,既可以通过仿真FPU,也可以通过生成没有任何FPU指令的代码。在这样的实现中,事情可以不同地工作,例如,直接执行从IEEE754 float到IEEE754 double的软件转换。

+0

那么,与是否IEEE754时格式转换发生?既然你说FPU使用80位代表,而不是IEEE754。 – larmbr

+0

@larmbr:我不确定我了解你的问题。在现代x86上,转换是在CPU/FPU内部实现的。 FPU命令可以将IEEE数据从存储器读入80位寄存器并将其存回存储器。无论与转换有关的步骤是否需要,都在CPU/FPU内部实现为硬件和/或微码。 – AnT

0

错误。 C标准从未在整数指定一个固定的,具体的限制和浮点型尺寸,尽管它们没有保证类型

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) 
sizeof(float) <= sizeof(double) <= sizeof(long double) 

C实现允许虽然大多数现在使用于使用任何类型的浮点格式的之间的关系IEEE-754及其后代。同样,他们可以自由使用任何整数表示,如1的补码或符号大小

关于促销规则,C标准前版本将表达式中的浮点数提升为double,但在C89/90中,规则已更改,float *浮动结果浮动结果。

If either operand has type long double, the other operand is converted to long double 
Otherwise, if either operand is double, the other operand is converted to double. 
Otherwise, if either operand is float, the other operand is converted to float. 

https://stackoverflow.com/a/5563131/995714

这一点在Java或C#是真实的,虽然,因为它们在虚拟机上运行的字节码,以及虚拟机的类型大小是恒定的跨平台

相关问题