lar*_*mbr 4 c floating-point double ieee-754 type-promotion
我知道在 C 和 Java 中,float 的底层表示是 IEEE754-32,double 是 IEEE754-64。
在表达式中,float将自动提升为double. 又怎样?以 3.7f 为例。过程是这样的吗?
- 3.7f 将使用 IEEE754 在内存中表示。它适合 4 个字节。
- 在计算过程中,它可能被加载到一个64位寄存器(或任何64位的地方),把3.7f变成IEEE754-64表示。
它非常依赖于实现。
例如,在 x86 平台上,FPU 命令集包括用于以 IEEE754float和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 指令的代码。在这样的实现中,事情可以不同地工作,例如,直接执行从 IEEE754float到 IEEE754 的软件转换double。
| 归档时间: |
|
| 查看次数: |
565 次 |
| 最近记录: |