c - float 变量如何自动提升为 double 类型?

标签 c floating-point double ieee-754 type-promotion

我知道在 C 和 Java 中,float 的底层表示是 IEEE754-32,double 是 IEEE754-64。

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

  1. 3.7f will be represented in memory using IEEE754. It fits in 4 bytes.
  2. During calculation, it may be loaded into a 64-bit register (or whatever 64-bit place), turning the 3.7f into IEEE754-64 represent.

最佳答案

它非常依赖于实现。

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

这意味着在 x86 平台上没有单步浮点到 double 转换这样的东西。每当需要进行这种转换时,它实际上是通过两步转换来实现的: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直接地。

关于c - float 变量如何自动提升为 double 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12118738/

相关文章:

c - openmp 代码执行期间的 "cygwin_exception::open_stackdumpfile error"

c - C中的类型提升

math - float 学有问题吗?

java - 平均前导零

c# - 将 Delphi Real48 转换为 C# double

c - *** 检测到堆栈崩溃 ***//尝试打印一个字符

c - 双重释放或释放时出现损坏错误

python - 截断 f 字符串 float 而不舍入

mysql - 存储统计数据,我需要 DECIMAL、FLOAT 还是 DOUBLE?

c# - 添加 double.MaxValue + double.MaxValue