我知道在C和Java中,float的基本表示形式是IEEE754-32,double是IEEE754-64。
在表达式中,float
将自动提升为double
。又怎样?
以3.7f为例。这个过程是这样吗?
最佳答案
它非常依赖于实现。
例如,在x86平台上,这组FPU命令包括用于以IEEE754 float
和double
格式(以及许多其他格式)加载/存储数据的命令。数据被加载到具有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
的软件转换。