我知道在C / Java中,浮点数的基础代表是IEEE754-32,双点是IEEE754-64。
在表达式操作中,浮点数将自动提升为double。又怎样? 以3.7f为例。这个过程是这样的吗?
- 3.7f将使用IEEE754在内存中表示。它适合4字节。
- 在计算过程中,它可能被加载到64位寄存器(或任何64位的位置), 将3.7f转换为IEEE754-64代表。
醇>
答案 0 :(得分:4)
它非常依赖于实现。
例如,在x86平台上,FPU命令集包括用于以IEEE754 float
和double
格式(以及许多其他格式)加载/存储数据的命令。数据被加载到具有80位宽度的内部FPU寄存器中。因此,实际上在x86上,所有浮点计算都以80位浮点精度执行。即所有浮点数据实际上都提升到80位精度。如何在这些寄存器中表示的数据完全无关紧要,因为无论如何都无法直接观察它们。
这意味着在x86平台上没有单步浮点到双转换这样的东西。每当需要进行这种转换时,它实际上实现为两步转换:float-to-internal-fpu和internal-fpu-to-double。
这个BTW在x86 FPU计算模型和C / C ++计算模型之间创造了显着的语义差异。为了完全匹配语言模型,处理器必须强制降低中间浮点结果的精度,从而对性能产生负面影响。许多编译器为用户提供控制FPU计算模型的选项,允许用户选择严格的C / C ++一致性,更好的性能或介于两者之间。
不是很多年前,FPU单元是x86平台的可选组件。无FPU平台上的浮点计算是在软件中执行的,可以通过模拟FPU或生成没有任何FPU指令的代码。在这样的实现中,事情可能会有所不同,例如,直接执行从IEEE754 float
到IEEE754 double
的软件转换。
答案 1 :(得分:0)
我知道在C / Java中,浮点数的基础代表是IEEE754-32,双点是IEEE754-64。
错误。 C标准从未在整数和浮点类型大小中指定固定的特定限制,尽管它们确实确保了类型之间的关系
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
sizeof(float) <= sizeof(double) <= sizeof(long double)
允许C实现使用任何类型的浮点格式,尽管大多数现在使用IEEE-754及其后代。同样,他们可以自由地使用任何整数表示,例如1的补码或符号幅度
关于促销规则,C的预标准版本会将表达式中的浮动内容加倍,但在C89 / 90中,规则已更改,float * float
会产生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.
在Java或C#中会是这样,因为它们在虚拟机中运行字节码,并且VM的类型在不同平台上是一致的