我知道在C和Java中,float的基本表示形式是IEEE754-32,double是IEEE754-64。

在表达式中,float将自动提升为double。又怎样?
以3.7f为例。这个过程是这样吗?


  • 3.7f将使用IEEE754在内存中表示。它适合4个字节。
  • 在计算过程中,可以将其加载到64位寄存器(或任何64位位置)中,从而将3.7f转换为IEEE754-64表示。
  • 最佳答案

    它非常依赖于实现。

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

    这意味着在x86平台上不存在单步浮点到双精度转换。每当需要进行此类转换时,实际上都将其实现为两步转换:float-to-internal-fpu和internal-fpu-double。

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

    不久之前,FPU单元是x86平台的可选组件。在无FPU平台上的浮点计算是在软件中执行的,方法是模拟FPU或生成完全没有任何FPU指令的代码。在这样的实现中,事情可能会有所不同,例如,直接执行从IEEE754 float到IEEE754 double的软件转换。

    09-25 22:19